Frage

Es sieht sicher harmlos genug. In meiner App Delegierter, überprüfe ich NSUserDefaults für ein Flag-Tipps beim Start zu zeigen. Wenn es dann gesetzt ist, am Ende des applicationDidFinishLaunching:, ich dies tun:

TipsViewController *vc = [[TipsViewController alloc]
  initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];

Die Idee ist, diese Ansicht vorübergehend zu zeigen. (Beachten Sie, dass es nicht ein modaler VC. Keine Navigation Controller an dieser Stelle, und es gibt keine Navigationsleiste in dieser Ansicht sowieso.)

Sobald diese Ansicht des Feldes verwiesen werden wir unser zuvorgekommen hinzufügen UITabBarController ‘s Blick auf das Fenster und über hinüber, dann entfernen Sie die Spitze Ansicht aus dem Hauptfenster. Ich habe es nicht zu der Ansicht Entlassung Punkt noch gemacht, weil, na ja, lesen Sie weiter.

VC My TipsView des verdrahtet ist mehr oder weniger wie folgt:

UIView -> view -> File’s Owner (TipsViewController)
  UIImageView -> background image
  UIView -> tipView -> File’s Owner
    UIImageView -> background image
    UIScrollView
      UILabel (tip text)
    UIButton -> touch-up-inside -> -(IBAction)button1:
    UIButton -> touch-up-inside -> -(IBAction)button2:
    UIButton -> touch-up-inside -> -(IBAction)button3:

Die Quelle enthält Erklärungen und Definitionen für alle drei IBAction Anrufe. Gerade jetzt zwei von ihnen nichts tun. Der dritte ändert die Spitze text, deren Größe zu passen, und passt die contentSize die Scroll-Ansicht zu entsprechen.

Wenn ich laufen die App, die TipsViewController Ansicht zeigt sich ganz gut. Ich kann sogar durch die Spitze Text scrollen. Allerdings, wenn ich ein Touch-up-innen auf jeden UIButton auslösen, Xcode beginnt mich in der Quelle zu pflanzen (wo ich einen Haltepunkt an jedem platziert habe IBAction ) ... und dann zieht mit entweder mit einem EXC_BAD_ACCESS oder obj_stack_overflow.

Ich habe verglichen diese mit anderen Teilen der App, wo ich eine VC, einen Blick und Schaltflächen. Es ist in jeder Hinsicht identisch, außer dass in diesem Fall Ich habe eine VC Ansicht als Subview des Fensters App anstelle der VC auf einen Navigation-Controller drücken . Darüber hinaus ist das View-Controller-Programmierhandbuch für iPhone OS docs sagen, das ist fair game:

  

Wenn Sie einen einzelnen View-Controller in   Ihre Anwendung, fügen Sie seine Ansicht zu   ein Fenster, anstatt die Ansicht des Hinzufügens   Controller zu einem Streifenstange oder Navigations   Controller.

True, I tun haben eine UITabBarController in der Warteschleife, und es hat Tabs mit UINavigationControllers (und andere VCs) darin. wenn die Spitze Ansicht gezeigt wird, jedoch die Tab-Leiste Controller Sicht hat nicht noch hinzugefügt, um das Fenster. Die Absicht ist es in tauschen, nachdem wir zeigen Tipps fertig sind. Mit anderen Worten, für alle Absichten und Zwecke, sind wir handeln vorübergehend wie wir einen einzigen VC im Spiel haben. Danach wechseln wir auf die Tab-Leiste und reißen die Spitze VC nach unten.

Vielleicht mache ich etwas subtil falsch? Gibt es einen besseren Weg? ( „Es muss ein besserer Weg sein!“)

Proben Stack-Trace:

#0  0x992b6f52 in objc_exception_throw
#1  0x302d6ffb in -[NSObject doesNotRecognizeSelector:]
#2  0x3026e056 in ___forwarding___
#3  0x3024a0a2 in __forwarding_prep_0___
#4  0x308f79d1 in -[UIApplication sendAction:to:from:forEvent:]
#5  0x309598b1 in -[UIControl sendAction:to:forEvent:]
#6  0x3095bad2 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#7  0x3095a81e in -[UIControl touchesEnded:withEvent:]
#8  0x30910fdf in -[UIWindow _sendTouchesForEvent:]
#9  0x308faecb in -[UIApplication sendEvent:]
#10 0x309013e1 in _UIApplicationHandleEvent
#11 0x32046375 in PurpleEventCallback
#12 0x30245560 in CFRunLoopRunSpecific
#13 0x30244628 in CFRunLoopRunInMode
#14 0x32044c31 in GSEventRunModal
#15 0x32044cf6 in GSEventRun
#16 0x309021ee in UIApplicationMain
#17 0x00002888 in main at main.m:14

Wie Sie aus der Spur sehen können, landen wir bei doesNotRecognizeSelector: up ... außer ich klar die Methoden in meiner Spitze VC Quelle sehen. Plus, sie sind alle verdrahtet. (Keine mehrere Verdrahtungen oder so etwas in IB. Alles sieht es gut aus, bis auf den Besitzer Beziehungen der Datei.)

Clues willkommen / geschätzt!

War es hilfreich?

Lösung

Das Problem ist, genau dort in dem ersten Code-Schnipsel: Du eine Instanz von TipsViewController erstellen, seine Ansicht zu halten, dann die View-Controller-Freigabe - was es bewirkt, dass ausgeplant werden. So, jetzt der target der Tasten ist ein Zeiger auf die ausgeplanten View-Controller.

Ein Blick behalten nicht ihre View-Controller, noch haben sie ihre Delegierten oder Ziele beibehalten.

Sie werden die View-Controller-Instanz beibehalten, vielleicht in einem retain halten müssen eigenschafts für so lange, wie Sie die Ansicht angezeigt werden sollen. Wenn Sie mit der Ansicht fertig sind, können Sie es von der übergeordneten Ansicht entfernen, und lassen Sie die View-Controller.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top