• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Storyboard & Views - Immer noch nicht ganz verstanden

Bizzi

Idared
Registriert
21.01.13
Beiträge
26
Hihi, ich glaube das Thema kennen bestimmt so einige.
Ich schnupper schon seit ein halben Jahr an Obj-C, komme aus richtung PHP und Java - Kontinuierlich bastel ich nicht, eher mal ab und zu.

Ich habe zwar schon vieles über Storyboarding und ViewControllern durchgelesen, begreife aber eine Sache immer noch nicht:

Wie kann ich eine View Programmiertechnisch ändern (Beispielsweise nach einem "Login")?


Dass man die einzelnen Views vom Storyboard im Interfacebuilder durch Buttons/actions "wechseln" kann weiß ich schon lange - Ist auch recht einfach und nett gestaltet.

Aber wenn ich nun zwei Views habe, möchte ich gerne beispielsweise bei einer LoginView zu einer weiteren View wechseln, sobald der Login erfolgreich war.

Problem was ich dabei habe ist das weiterverwenden von Objekten. Muss ich jeden (in Anführungszeichen) "Mist" Statisch und Global halten, oder was?
 

Bizzi

Idared
Registriert
21.01.13
Beiträge
26
Schade, dass bis dato niemand versucht hat mir dies ein wenig zu erklären. Naja, was will man von derartige Foren auch erwarten - Ist ja überall das selbe.
 

GoodGuy

Granny Smith
Registriert
02.12.12
Beiträge
12
Meinst du vielleicht sowas wie : einen View mit InterfaceBuilder zu Erstellen, jedoch nicht direkt über eine Storyboard Segue den Wechsel zu diesem View durchführen?
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Problem was ich dabei habe ist das weiterverwenden von Objekten. Muss ich jeden (in Anführungszeichen) "Mist" Statisch und Global halten, oder was?

Hi Bizzi,
seit es die Storyboards gibt, ist das mit der Werteübergabe ja noch viel einfacher. Du definierst zunächst in dem zweiten ViewController deine propertys...in etwa so.
Code:
@property (nonatomic, strong) NSString*username;
anschließend in der *.m datei den syntesize-Befehl nicht vergessen.
In dem ErstenView Controller (m-Datei) definierst du die Methode prepareForSegue wie folgt
Code:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  [segue.destinationViewController setUsername: [I]variablennane[/I]]
}
wobei du Variablenname natürlich durch die Variable ersetzten musst in der du den Username im ersten ViewController speicherst.
Ich hoffe das war es was du wissen wolltest. Kannst ja mal bescheid geben ob das geklappt hat ;)
 

Bizzi

Idared
Registriert
21.01.13
Beiträge
26
Vielen Dank für eure Antworten :)

@GoodGuy
Wenn ich das so nun verstehe, ja.
Im IB können die einzelnen Views ja durch Button Action gewechselt werden (Ich glaub das mit diesen "Segue" sind ja die Referenzen, bzw. Die Identifizierungen der Views oder?).

ich möchte halt die Views nicht nur durch eine Button-Action wechseln, sondern auch Programmiertechnisch (Wie im Beispiel eines Logins).

@bginner
Wie man die Variablen definiert habe ich bereits schon herausgefunden, auch das mit dem Synthesize & Co.
Das mit der Werteübergabe mit prepareForSegue kannte ich hingegen noch nicht - Vielen Dank :)


Ich habe halt folgendes vor:
Ich möchte eine Verbindung über ein TCP Socket auf ein Java-Server aufbauen (Funktioniert alles soweit). Wenn ich mich nun Authentifiziere und dieses erfolgreich war, soll er die View wechseln.

Mit der "Werteübergabe" meine ich beispielsweise die aktive Connection auch auf den anderen Views zu nutzen.
Müsste/Sollte ich dann dort mit "Instanzen" arbeiten? Sprich, die MainView besitzt die Connection/send/Receive Methoden. müsste ich dann die Instanz der MainView an den anderen Views übergeben um dann auf die Methoden der MainView zuzugreifen, oder reicht einfach nur das includen der Header-Files.

Ich bin gerade nicht auf dem neusten stand, da es schon ein paar Wochen her ist, als ich damit herumexperimentiert hatte, aber irgendetwas war da an Problemen die auftauchten, als ich die Headerfiles eingebunden hatte.

Natürlich möchte ich auch nach wechseln der View wieder auf die MainView wechseln können. gibt's da vielleicht noch weitere Methoden, die dabei Hilfreich wären? Ich habe irgendwie in Erinnerung dass man die "Segues" ansprechen kann. Kann mir vielleicht jemand einmal kurz auflisten was hier am sinnvollsten ist? Wie benenne ich eine Segue überhaupt? Ich glaub über die Button Actionfilm hat Xcode dies automatisch gemacht gehabt(?)


P.S. Sollten einige Fachbegriffe Falsch sein, nicht wundern :p Bin derzeit mit dem iPad online und hab noch diese ****** Rechtschreibkorrektur an weil ich des iPad gestern Abend mit iOS 6.01 Beta 4 bestückt hatte. muss ich gleich noch deaktivieren ^^
 

GoodGuy

Granny Smith
Registriert
02.12.12
Beiträge
12
durch eine Button-Action
Nun ja, dass du eine Button Action in deinem Code aufrufst ist auch nicht schwer.
1.Du machst im Interface Builder dein View mit Buttons etc.
2. Dann wählst du die .h Datei deiner Klasse und stellst dein Xcode Editor auf "Assistant" um. (Rechts oben bei der Unterschrift "Editor" aufs Mittige klicken). (Somit muss links oder rechts deine .h Datei deiner Klasse sein und gleich neben dein Interface Builder)
3. Dann wählst du im Interface Builder deinen Button aus und haltest die ctrl Taste und ziehst den "Faden" in deine .h Datei rein.
4. Da wird eine Property erstellt, bei dem PopUp Menü kannst du Art der Property auswählen, in unserem Fall gibt's IBOutlet und IBAction, wir nehmen klarerweise IBAction. Enter drücken.
5. In deiner .m Datei wird danach automatisch eine IBAction Methode für diesen Button erstellt (ganz unten im Code). Somit wird diese immer aufgerufen wenn du denn Button druckst.

GoodGuy
 

Bizzi

Idared
Registriert
21.01.13
Beiträge
26
Das ist mir klar. Entschuldigung, aber hast du mein Post durchgelesen? Das mit der Button-Action war leider nicht gefragt. Ich habe nur erwähnt, dass ich weiß wie es mit der Button-Action abläuft, möchte aber keine Button-Action nehmen, sondern dies Programmiertechnisch Lösen.

Die Frage ist, wie setze ich eine UIStoryboardSegue für eine View und rufe diese dann über eine Methode auf, so dass ich diese wechseln kann?
 

Bizzi

Idared
Registriert
21.01.13
Beiträge
26
PerformSegueWithIdentifier
Zitat aus allen meiner Posts:
[...]Wie benenne ich eine Segue überhaupt?[...]
Die Frage ist, wie setze ich eine
UIStoryboardSegue für eine View[...]

Hier mal ein Beispiel:
Ich habe nun zwei Views im IB erstellt und die IBOutlets/Actions gesetzt:

Code:
[COLOR=#C60000][COLOR=#009800]/* ViewController.h */[/COLOR][COLOR=#2900ff]
#import [/COLOR]<UIKit/UIKit.h>[/COLOR]


[COLOR=#2900ff]@interface[/COLOR] ViewController : [COLOR=#0097b4]UIViewController[/COLOR] {
        [COLOR=#2900ff]IBOutlet[/COLOR] [COLOR=#0097b4]UIButton[/COLOR] *button_login;
        [COLOR=#2900ff]IBOutlet[/COLOR] [COLOR=#0097b4]UILabel[/COLOR] *label_login;
        [COLOR=#2900ff]IBOutlet[/COLOR] [COLOR=#0097b4]UITextField[/COLOR] *input_nickname;
    }


[COLOR=#2900FF][COLOR=#000000]    [/COLOR]@property[COLOR=#000000] ([/COLOR]nonatomic[COLOR=#000000], [/COLOR]retain[COLOR=#000000]) [/COLOR]IBOutlet[COLOR=#0097b4]UIButton[/COLOR][COLOR=#000000] *button_login;[/COLOR][/COLOR]
[COLOR=#2900FF][COLOR=#000000]    [/COLOR]@property[COLOR=#000000] ([/COLOR]nonatomic[COLOR=#000000], [/COLOR]retain[COLOR=#000000]) [/COLOR]IBOutlet[COLOR=#0097b4]UILabel[/COLOR][COLOR=#000000] *label_login;[/COLOR][/COLOR]
[COLOR=#2900FF][COLOR=#000000]    [/COLOR]@property[COLOR=#000000] ([/COLOR]nonatomic[COLOR=#000000], [/COLOR]retain[COLOR=#000000]) [/COLOR]IBOutlet[COLOR=#0097b4]UITextField[/COLOR][COLOR=#000000] *input_nickname;[/COLOR][/COLOR]


    - ([COLOR=#2900ff]IBAction[/COLOR]) login: ([COLOR=#2900ff]id[/COLOR]) sender;
[COLOR=#2900FF]@end

[COLOR=#009800]/* ViewController.m */
[/COLOR][/COLOR][COLOR=#C60000][COLOR=#2900ff]#import [/COLOR]"ViewController.h"[/COLOR]


[COLOR=#0097B4][COLOR=#2900ff]@interface[/COLOR][COLOR=#000000] [/COLOR]ViewController[COLOR=#000000] ()[/COLOR][/COLOR]
[COLOR=#009800][COLOR=#000000]	[/COLOR]/* Do Nothing */[/COLOR]
[COLOR=#2900FF]@end[/COLOR]


[COLOR=#2900ff]@implementation[/COLOR] ViewController
	[COLOR=#2900ff]@synthesize[/COLOR] button_login,
				label_login,
				input_nickname;


	- ([COLOR=#2900ff]void[/COLOR])viewDidLoad {
[COLOR=#0097B4][COLOR=#000000]		[[/COLOR][COLOR=#2900ff]super[/COLOR][COLOR=#000000] [/COLOR]viewDidLoad[COLOR=#000000]];[/COLOR][/COLOR]
	}


	- ([COLOR=#2900ff]void[/COLOR])didReceiveMemoryWarning {
[COLOR=#0097B4][COLOR=#000000]		[[/COLOR][COLOR=#2900ff]super[/COLOR][COLOR=#000000] [/COLOR]didReceiveMemoryWarning[COLOR=#000000]];[/COLOR][/COLOR]
    }


	- ([COLOR=#2900ff]IBAction[/COLOR]) login: ([COLOR=#2900ff]id[/COLOR]) sender {
[COLOR=#C60000][COLOR=#000000]		[/COLOR][COLOR=#0097b4]NSLog[/COLOR][COLOR=#000000]([/COLOR]@"Anmelden und view welchseln..."[COLOR=#000000]);[/COLOR][/COLOR]
		
[COLOR=#0097B4][COLOR=#000000]		[/COLOR]NSString[COLOR=#000000] *nickname = [[/COLOR]input_nickname[COLOR=#000000] [/COLOR]text[COLOR=#000000]];[/COLOR][/COLOR]
[COLOR=#009800][COLOR=#000000]		[/COLOR]// Testweise, Prüfung geschieht nachher über TCP/IP[/COLOR]
		[COLOR=#2900ff]if[/COLOR]([nickname [COLOR=#0097b4]isEqualToString[/COLOR]:[COLOR=#c60000]@"test"[/COLOR]]) {
[COLOR=#0097B4][COLOR=#000000]			[[/COLOR][COLOR=#2900ff]self[/COLOR][COLOR=#000000] [/COLOR]performSegueWithIdentifier[COLOR=#000000]:[/COLOR][COLOR=#c60000]@"Overview"[/COLOR][COLOR=#000000] [/COLOR]sender[COLOR=#000000]:sender];[/COLOR][/COLOR]
		} [COLOR=#2900ff]else[/COLOR] {
[COLOR=#C60000][COLOR=#000000]			[[/COLOR][COLOR=#0097b4]label_login[/COLOR][COLOR=#000000] [/COLOR][COLOR=#0097b4]setText[/COLOR][COLOR=#000000]:[/COLOR]@"Benutzer falsch!"[COLOR=#000000]];[/COLOR][/COLOR]
		}
	}
[COLOR=#2900FF]@end[/COLOR]

Wie kann ich denn den Identifizier von der zweiten View setzen (Das frage ich schon die ganze Zeit)? Es gibt zwar Einstellungsmöglichkeiten, wie z.B. Identity > Registration ID, aber wo genau setze ich den "Namen" der Segue, die ich dann mit [selfperformSegueWithIdentifier:@"Overview"sender:sender]; switchen kann?

Ich bekomme eine Exception (ist ja normal), da die Segue nicht gefunden wurde:

'NSInvalidArgumentException', reason: 'Receiver (<ViewController: 0x1d5348d0>) has no segue with identifier 'Overview''
 

Bizzi

Idared
Registriert
21.01.13
Beiträge
26
Ok, Erledigt. Ich konnte des nun durch herumprobieren selber machen.

Nochmal für diejenigen, die auch danach Fragen:
Eine Segue ist eine verbindung der einzelnen Views, so wie ich das nun verstanden habe (Siehe http://imm.io/TQ3F).

Um [selfperformSegueWithIdentifier:@"NAME DER SEGUE"sender:sender]; Nutzen zu können muss nun diese Verbindung benannt werden. Dies geht ganz einfach, indem man diese anwählt und rechts unter Attribute der Segue einem Namen/Identifier gibt.
Eine Segue zwischen den einzelnen Views können ganz einfach angelegt werden: Die erste View anwählen und über der linken Box wo die View Scenes sind, einfach eine Segue-Referenz zur anderne View erstellen.