Ich bin mit VB-basierten Anwendungen sehr vertraut, bin aber neu in Xcode (und Objective C). Ich habe zahlreiche Tutorials im Web gelesen und verstehe die Grundlagen und die Interaktion mit Interface Builder usw. Ich habe jedoch Probleme mit einigen Grundbegriffen der C-Sprache und wäre dankbar für jede Hilfe, die Sie anbieten können. Heres mein Problem ...
Ich habe eine einfache iPhone App, die einen View-Controller (FirstViewController) und eine Unteransicht (SecondViewController) mit zugehörigen Header- und Klassendateien hat.
Im FirstViewController.m ist eine Funktion definiert
%Vor%Es spielt keine Rolle, was die Funktion ist.
Ich möchte diese Funktion in meinem SecondViewController verwenden, also importiere ich in SecondViewController.m FirstViewController.h
%Vor%In dieser letzten Zeile ist mein Problem. XCode teilt mir mit, dass FirstViewController möglicherweise nicht auf writeToServer reagiert. Und wenn ich versuche, die Anwendung auszuführen, stürzt es ab, wenn diese Funktion aufgerufen wird.
Ich denke, ich verstehe nicht vollständig, wie man Funktionen teilt und, noch wichtiger, die Beziehung zwischen Klassen.
In einer idealen Welt würde ich eine globale Klasse erstellen, in die ich meine Funktionen einfügen und sie nach Bedarf aufrufen kann.
Jeder Rat wurde dankbar angenommen.
In der Deklaration Ihrer Methode:
%Vor%Das - am Anfang der Deklaration zeigt an, dass es sich um eine sofortige Methode handelt. Dies bedeutet, dass Sie eine Instanz Ihrer Klasse erstellen müssen, um sie aufzurufen. Wenn es ein + wäre, wäre die Methode eine Klassenmethode und Sie könnten sie so nennen wie in Ihrem Code.
Beispiel:
%Vor%Dann in einer Funktion:
%Vor%In der Zeile:
%Vor% ... Sie senden die Nachricht writeToServer:
an die Klasse FirstViewController
. Stattdessen müssen Sie es an ein FirstViewController
Objekt senden. Dies bedeutet, dass Sie eine Referenz auf ein FirstViewController
-Objekt erhalten und dann das -Objekt an die Nachricht writeToServer:
senden müssen:
Da jedoch immer nur eine Ansicht auf dem iPhone aktiv ist, sollten die Objekte FirstViewController
und SecondViewController
nicht gleichzeitig vorhanden sein und miteinander kommunizieren. Stattdessen sollten Sie unabhängige Klassen erstellen, um die erforderliche Klasse auszuführen, und der aktive Ansichtscontroller sollte mit diesen Klassen interagieren.
Hinweis : "Sie senden die Nachricht sayHello:
an das Objekt myObject
" ist nur eine andere Art zu sagen "Sie rufen die Methode writeToServer:
auf des Objekts myObject
. (Eine "Methode" ist wie die objektorientierte Version einer Funktion.)
Ich würde empfehlen, das Lernziel-C und Lernt Cocoa II Lernprogramme auf Cocoa Dev Central , um mehr über Cocoa / Objective-C und objektorientierte Programmierung .
In Ihrer FirstViewController.h
-Datei müssen Sie writeToServer
als Methode von FirstViewController
object im Abschnitt @interface deklarieren
Zweitens ist die folgende Nachricht, die Sie senden, ungültig, da FirstViewController
writeToServer
keine Klassenmethode ist und nur gültig ist, wenn sie von einer Instanziierung der Klasse FirstViewController
aufgerufen wird.
Oder so ähnlich.
Sie müssen schreiben:
%Vor%in Ihrer FirstViewController.h-Datei. Dies ist ein Hinweis für den Compiler, dass die Funktion für diese bestimmte Klasse verfügbar ist. Ihr Code würde immer noch ohne das funktionieren, da die tatsächliche Funktion implementiert wird, aber Sie erhalten die Warnung, da der Compiler die M-Datei für vorhandene Funktionen nicht überprüft, wenn Sie den Header aus einer anderen Quelldatei einschließen.
Wenn Sie diese Methode wie diese aufrufen möchten, deklarieren Sie nur die Methode writeToServer als Klassenmethode (kurz: statische Methode ...)
dafür haben Sie deklarieren und definieren Sie es wie
%Vor%einziger Unterschied ist + Zeichen anstelle von -
Die zweite Option erstellt eine Instanz von FirstViewController und ruft die bestehende Methode
aufd. h.
%Vor%%Vor%FirstViewController.h
%Vor%FirstViewController.m
%Vor%SecondViewController.h
%Vor%SecondViewController.m