0

Ich habe ein ‚viewContoller‘ VC1 und einen Behälter Blick in es mit einem Tisch-View-Controller in VC1 eingebettet .iOS - wie der Zugriff auf eine Variable aus dem Behälter Ansicht zu erhalten und es zurück an den View-Controller passieren

Ich habe eine Variable namens Nummer, die sich nach der didSelectRowAtIndexPath und Abzug mit didDeselectRowAtIndexRowPath seit seiner Tabelle addiert.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
} 

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
} 

Dieses „Nummer“ Wert gehört zu den eingebetteten Controller Tabelle, und ich muss es in VC1 zugreifen.

Zusätzlich wird die „Nummer“ Variable entsprechend ändert sich ständig, um es zu werden oder abgewählt und VC1 wissen muss, wenn dies geschieht, so hat es den aktualisierten Wert.

Ich habe seit Tagen eine Lösung gesucht, jede Hilfe wäre willkommen.

Antwort

1

Einfach, wie unten tun,

1) Builder-Schnittstelle gehen und setzen Sie Namen Ihren segue von UIContainerView einbetten (lassen Sie sich 'abc' sagen). Später werden wir von VC1 darauf zugreifen (in Schritt 4).


2) Definieren Sie Ihre number Variable in VC1-Header.


3) In Tabellenkopf-View-Controller einen Verweis auf Ihre VC1 wie folgt definieren,

@property(nonatomic, retain) VC1 *VC; 

4) In VC1-Klasse implementieren prepareForSegue und wie unten tun,

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSString * segueName = segue.identifier; 
    if ([segueName isEqualToString: @"abc"]) { 
     TableViewController *tblVC = (TableViewController *) [segue destinationViewController]; 
     tblVC.VC = self; 
    } 
} 

5) Jetzt können Sie im Tabellenansicht-Controller auf Ihre Zahlenvariable wie unten,

zugreifen
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

if (self.VC) { 
     self.VC.number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    } 
} 

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 

if (self.VC) { 
    self.VC.number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    } 
} 

Jetzt können Sie Zugriff auf number Variable aus VC1, da es in VC1 Header definiert ist. Denken Sie daran, dies ist nur ein Weg, um Ihre Anforderung zu erfüllen, gibt es mehrere Möglichkeiten, um mit dieser Art von Situationen umzugehen. Wie, wenn Sie möchten, können Sie auch anders herum tun.

+0

Danke für die Antwort. Ich habe es als eine globale Eigenschaft definiert, aber in der Tabellenansicht Controller. Also schlagen Sie vor, ich muss den Tabellenansicht-Controller unterklassifizieren und dann die didSelect- und didDeselect-Methoden in den viewcontroller anstatt in den Tabellenansicht-Controller verschieben, auf diese Weise kann ich darauf zugreifen? –

+0

@ Tony.C Antwort mit der genauen Lösung geändert. –

+0

Hey Prasad danke für die Antwort. Alles funktioniert execept self.VC.number in der Didselect-Methode. Es erkennt die Zahlenvariable nicht. Und für diese @property (nicht atomare, behalten) VC1 * VC; Ich ersetzte es durch @property (nichtatomare, behalten) UIViewController * VC; –

0

Wenn ich Ihre Frage richtig erkläre, haben Sie eine TableView innerhalb einer VC und Sie möchten aktualisiert werden, wenn ein Benutzer didSelect/DidDeselect eine Zeile.

Eine alternative Lösung wird eine Protokollimplementierung haben.

@protocol SpecialTableViewFunctionDelegate <NSObject> 

@optional 
- (void)didSelectSomethingUpdatedNumber:(NSNumber *)number; 
- (void)didDeselectSomethingUpdatedNumber:(NSNumber *)number; 
@end 

Dies ist natürlich vorausgesetzt, Sie tableView subclassed.

Auf dem Tableview Unterklasse können Sie die Delegaten zum Beispiel hinzufügen:

@interface tableviewSubclass :UITableView 
@property (nonatomic, weak)id<SpecialTableViewFunctionDelegate>delegate; 
@end 

dann auf dem select-Methode haben Sie so etwas wie zu tun:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    if(_delegate){ 
    if([_delegate respondsToSelector:(@selector(didSelectSomethingUpdatedNumber:)]){ 
     [_delegate didSelectSomethingUpdatedNumber:number]; 
    } 
    } 
} 

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    if(_delegate){ 
     if([_delegate respondsToSelector:(@selector(didDeselectSomethingUpdatedNumber:)]){ 
     [_delegate didDeselectSomethingUpdatedNumber:number]; 
    } 
    } 
    } 
} 

dann auf VC einfach haben, Ordnen Sie den Delegierten sich selbst zu. tableViewInstance.delegate = self;

Vergessen Sie nicht, die Delegierten den Kopf <SpecialTableViewFunctionDelegate>

Auf diese Weise enthält, die Sie benachrichtigt werden, wenn es eine Auswahl/Ausschluß der Zelle

+0

Danke für die Antwort. Nur um meine Frage zu klären, habe ich eine Containeransicht innerhalb des View-Controllers, der in einen Table-View-Controller eingebettet ist. Die obigen Methoden gehören zur Tabellenansicht und die Variable "number" wird in der Tabellenansicht mit diesen Methoden aktualisiert. In meiner Ansicht muss der Controller, der diese Tabellenansicht enthält (die aus der Containeransicht eingebettet ist), jedoch die Variable number verwenden. Ihre Lösung geht davon aus, dass ich bereits auf die Variable zugreifen kann, was ich nicht kann. Hoffentlich verstehe ich kein Missverständnis. Ich habe die Tabellenansicht nicht unterklassifiziert. –

+0

@ Tony.C eigentlich brauchen Sie nicht Zugriff darauf, da Sie gerade die Nummer auf dem Delegaten an die VC übergeben. Da Sie die tabellensicht nicht abgeleitet haben, ist dieser Ansatz nicht anwendbar. Ich schlage vor, es zu untergliedern und ihm ein Protokoll wie beschrieben zu geben. Auf diese Weise greifen Sie nicht direkt auf die Variable zu, sondern übergeben sie an den zugewiesenen Delegaten. Ich hoffe, ich habe eine klare Erklärung für meinen Vorschlag gegeben – Joshua

0

Gemeinsame Nutzung von Daten zwischen verschiedenen Klassen ist in verschiedenen getan werden können, Wege, aber die sauberste Art zu tun ist, die geteilten Daten außerhalb aller Klassen zu halten, die diesen Wert benutzen/ändern, indem sie dem lose gekoppelten Entwurf folgen. Man kann sich eine Singleton-Klasse vorstellen, aber das wird eine Art Übernutzung sein, wenn wir nur eine Eigenschaft (Wert) haben, die geteilt wird. In diesem Fall können wir eine Klasse mit einer internen statischen Variablen und Klassenmethoden (mit + Zeichen) haben. um darauf zuzugreifen. Hier ist der Code für das gleiche:

.h file---> 
#import <Foundation/Foundation.h> 

@interface SharedData : NSObject 

+(void)resetNumber; 
+(void)incrementNumber; 
+(void)decrementNumber; 
+(int)getNumber; 
@end] 

.m Datei --->

#import "SharedData.h" 

@implementation SharedData 

static int number; 

+(void)resetNumber { 
    number = 0; 
} 

+(void)incrementNumber { 
    number++; 
} 

+(void)decrementNumber { 
    number--; 
} 

+(int)getNumber { 
    return number; 
} 


@end 

Hier ist die Nutzung der Klasse Verwendung @class Shared nur zu importieren, bevor @implementation

[SharedData incrementNumber] 

Hoffe, das könnte Ihnen helfen !!!!!