2010-09-22 10 views
11

hoffe, jemand kann mir helfen, wie seit Stunden festgefahren.iPhone: Aufruf einer Eltern/Super-Methode aus einer Unteransicht

Ich versuche, eine Art Bilderbuch zu machen. Ich habe eine Sicht, die mein Container ist, und ich füge Subviews hinzu, indem ich addsubview verwende.

In der Unteransicht habe ich Streichen Gesten usw., die ich in der Elternansicht Methode auslösen möchte. Ich habe herausgefunden, wie ich den Delegaten auslösen kann, aber ich kann den Delegaten nicht dazu bringen, die Elternansicht auszulösen. Ich habe über 10 verschiedene Möglichkeiten gelesen und keine funktioniert.

Ich bin jetzt sehr verwirrt darüber, was eine super Aussicht ist. Nur Angelegenheiten zu verwirren, hat der Delegierte eine tabcontroller und die übergeordnete Ansicht ist Tab-Taste 1

Ich versuchte

[self.view.superview method] 
[self.superview method] 

Auf der Delegierten versuchte ich self.tabcontroller.parentviewcontroller, selectedview, super view.super

UPDATE: Die Unteransicht muss unabhängig von der übergeordneten Ansicht sein, da es sich um eine wiederverwendbare Ansicht handelt. Auch ich habe die Elternansicht nicht auf superview gesetzt, weil ich gerade dachte, eine Superview ist eine Ansicht mit Unteransichten (bitte töte mich nicht). Also muss ich vielleicht die Elternansicht auf eine Superview setzen?

+0

Was ist Ihr Delegatobjekt? Ist es ein 'UIViewController'? – kubi

+0

es ist ein Unterklasse UIViewController – Burf2000

Antwort

23

Der richtige Weg, solche Dinge zu tun Protokoll und delegieren Muster zu verwenden ist .

ein Protokoll definieren wie

@protocol subViewDelegate 
    -(void)somethingHappened:(id)sender; 
@end 

dann das Protokoll in Ihrem Superview implementieren:

@interface superView:UIViewController<subViewDelegate> { 
... 
} 
... 
@end 

einen Delegaten Eigenschaft in Ihrem SubView wie diese

@interface subView : UIView { 
    id<subViewDelegate> delegate; 
    ... 
} 
@propery (nonatomic, assign) id<subViewDelegate> delegate; 
... 
@end 

die in Ihrem subview definieren , rufen Sie den Delegierten wie folgt

[self.delegate somethingHappened :self]; 
+0

Dies sind ViewControllers keine Ansichten. Auch die Unteransicht kann unabhängig von der Superansicht sein. ZB verwendet es alle anderen den Platz – Burf2000

+0

das gleiche Prinzip gilt für beide. Ich nahm an, dass Sie einen viewController haben, der eine Ansicht und ihre Unteransichten verwaltet. – VdesmedT

+0

Nein, jeder hat seinen eigenen viewController. Also musste jede Seite eines Buches mit einer separaten Klasse sein – Burf2000

3

Es ist ein wenig hart Sie ohne Code gegeben zu helfen, aber wir versuchen:

  1. ein Protokoll erstellen: Nennen Sie es aber wie Sie (ich nenne es „MyProtocol“) und fügen Sie die Definition, um es von der Funktion, die Sie in Ihrem Superview aufrufen möchten, nennen wir es "antwortToSwipe"
  2. Wenn Ihre Superview eine UIView ist, müssen Sie Ihre eigene Unterklasse von UIView erstellen und Ihre Superview eine Instanz dieser Klasse machen.
  3. Lassen Sie Ihre (neu) erstellt Superklasse das Protokoll des 1. implementieren) eine Umsetzung der „respondToSwipe“ Methode
  4. eine Instanzvariable des Typs ID in Ihrem subview erstellen, und nennen Sie es Ihnen jedoch gerne, zum Beispiel "meinDelegat".
  5. Übergeben Sie die Superview in 2/3 erstellt.), Um Ihre „MyDelegate“ Variable
  6. Anruf [MyDelegate respondToSwipe] wann immer Sie mögen
-1

Hat sich die übergeordnete Ansicht beim Hinzufügen der Unteransicht als Superview der Unteransicht festgelegt?Ansonsten weiß die Subview nicht, wer ihre Superview ist.

Die Standardmethode zum Benennen von Dingen zum Aufrufen des Methodenhandlers der Delegat anstelle der Superansicht, machen Sie es zu einer Eigenschaft und lassen Sie die Unteransicht sowohl für die Existenz des Delegaten überprüfen und ob es die Methode verarbeiten kann.

+0

Ich habe nichts auf superview gesetzt, nahm ich an war super, als ich ihm eine Ansicht hinzufügte – Burf2000

+0

"Super" ist nicht dasselbe wie Superview. Ihre Annahme ist also aus mehreren Gründen falsch (was eine andere Frage ist). – hotpaw2

+0

Ich füge eine Unteransicht zu einer Ansicht hinzu, dann möchte ich die übergeordneten Ansichtsmethoden aufrufen? irgendwelche Ideen? – Burf2000

0

Für eine benutzerdefinierte Ansicht, könnten Sie UIControl Unterklasse und Steuerungsereignisse verwenden:

  • einige Ereignisse Kontrolle definieren. Du bist frei, 4 Steuerungsereignisse zu bilden (UIControlEventApplicationReserved = 0x0F000000)
  • Haben wer will Ereignisse addTarget rufen erhalten: Aktion: forControlEvents:
  • Haben Sie den Kontrollanruf [self sendActionsForControlEvents:events]

Alternativ können Sie eine UIGestureRecognizer verwenden -Stil-Schnittstelle (addTarget: Aktion :).

Alternativ verwenden nur UIGestureRecognizer (OS 3.2+)

Verwandte Themen