"Normaler" UIButton, der die Ausnahme "obj_stack_overflow" oder "EXC_BAD_ACCESS" verursacht

Es sieht sicher harmlos genug aus. In meinem App-Delegaten überprüfe ichNSUserDefaults Damit eine Flagge Tipps beim Start anzeigt. Wenn es gesetzt ist, am Ende vonapplicationDidFinishLaunching:Mache ich das:

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

Diese Ansicht soll vorübergehend angezeigt werden. (Beachten Sie, dass es sich nicht um eine modale VC handelt. Derzeit ist kein Navigations-Controller vorhanden. Außerdem ist in dieser Ansicht keine Navigationsleiste vorhanden.)

Sobald diese Ansicht verworfen wird, fügen wir unsere vorgelagerte hinzuUITabBarControllerZeigen Sie auf das Fenster und wechseln Sie dorthin. Entfernen Sie dann die Spitzenansicht aus dem Hauptfenster. Ich habe es noch nicht bis zum Entlassungspunkt geschafft, denn lesen Sie weiter.

Der VC von My TipsView ist mehr oder weniger wie folgt verkabelt:

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 dreiIBAction Anrufe. Im Moment tun zwei von ihnen nichts. Der dritte ändert die Spitzetext, passt die Größe an und passt die Bildlaufansicht ancontentSize passen.

Wenn ich die App starte, wird dieTipsViewController Ansicht zeigt sich ganz gut. Ich kann sogar durch den Tipptext scrollen. Allerdings, wenn ich ein Touch-Up-Inside auslöseUIButton, Xcode fängt an, mich in der Quelle zu platzieren (wo ich jeweils einen Haltepunkt gesetzt habeIBAction) ... und steigt dann mit einemEXC_BAD_ACCESS oderobj_stack_overflow.

Ich habe dies mit anderen Teilen der App verglichen, in denen ich eine VC, eine Ansicht und Schaltflächen habe. Es ist in jeder Hinsicht identisch, außer dass in diesem FallIch habe eine VC-Ansicht als Unteransicht des App-Fensters hinzugefügt, anstatt die VC auf einen Navigationscontroller zu verschieben. Darüber hinaus ist dieView Controller-Programmierhandbuch für iPhone OS Docs sagen, das ist faires Spiel:

Wenn Sie in Ihrer Anwendung einen einzelnen Ansichts-Controller verwenden, fügen Sie dessen Ansicht einem Fenster hinzu, anstatt den Ansichts-Controller einer Registerkartenleiste oder einem Navigations-Controller hinzuzufügen.

Richtig, ichtun haben eineUITabBarController Warten in den Flügeln, und es hat Tabs mitUINavigationControllers (und andere VCs) drin. Wenn jedoch die Tippansicht angezeigt wird, hat die Ansicht des Registerkartenleisten-Controllersnicht wurde noch nicht zum Fenster hinzugefügt. Es soll ausgetauscht werden, nachdem wir Tipps angezeigt haben. Mit anderen Worten, in jeder Hinsicht verhalten wir uns vorübergehend so, als hätten wir eine einzelne VC im Spiel. Danach wechseln wir zur Tab-Leiste und reißen die Spitze VC ab.

Vielleicht mache ich etwas auf subtile Weise falsch? Gibt es einen besseren Weg? ("Es muss einen besseren Weg geben!")

Sample 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 der Spur entnehmen können, landen wir beidoesNotRecognizeSelector: … Außer dass ich die Methoden in meiner VC-Quelle deutlich sehen kann. Außerdem sind sie alle verkabelt. (Keine Mehrfachverdrahtung oder ähnliches in IB. Alles sieht dort gut aus, bis auf die Eigentümerbeziehungen der Datei.)

Hinweise willkommen / geschätzt!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage