совместное использование данных между UIViewController и UIViewController в UITabBarController xcode

#iphone #xcode

#iPhone #xcode

Вопрос:

Я знаю, как сделать для обмена данными между двумя представлениями. Но если я хочу поделиться данными с помощью TabBarController, я потерян.

Это мое IBAction для перехода на мою панель вкладок.

 -(IBAction)goToPage2:(id)sender
{
 tabController.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
 [self presentModalViewController:tabController animated:YES];
}
  

мне нужно поделиться моей NSString * dataStr в моем IBAction в первом представлении моей панели вкладок.

 firstView *first = [[firstView alloc] initWithNibName:@"firstView" bundle:nil];
first.dataStr = name.text;
[tabController  presentModalViewController:first animated:YES];
  

этот код не работает.

спасибо

Ответ №1:

Объявите @property в делегате вашего приложения. И вы можете получить доступ к своему делегату приложения из любой точки вашего приложения.

 MyAppDelegate *appDelegate =  (MyAppDelegate *)[[UIApplication sharedApplication ]delegate]
  

Ответ №2:

Я согласен с тем, что предложил Теренте. Но я рекомендую вам использовать класс данных в этом случае. Использование свойства в Appdelegate не является хорошей практикой. Вы всегда должны использовать класс данных для этого.
Вы создаете класс данных следующим образом:
Вам нужно создать класс данных, в котором вы можете устанавливать свойства переменных или, в вашем случае, массивов (для отображения данных в UITableView). Реализуйте метод класса в классе данных, который проверяет, был создан экземпляр этого объекта или нет. Если нет, то это произойдет. Это что-то вроде этого :

//DataClass.h

 @interface DataClass : NSObject {  

NSMutableArray *nameArray;  
NSMutableArray *placeArray;     

}  
@property(nonatomic,retain)NSMutableArray *nameArray;  
@property(nonatomic,retain)NSMutableArray *placeArray;  
 (DataClass*)getInstance;  
@end  
  

//DataClass.m

 @implementation DataClass  
@synthesize nameArray;  
@synthesize placeArray;  
static DataClass *instance =nil;  
 (DataClass *)getInstance  
{  
    @synchronized(self)  
    {  
        if(instance==nil)  
        {  

            instance= [DataClass new];  
        }  
    }  
    return instance;  
}  
  

Теперь в вашем контроллере просмотра вам нужно вызвать этот метод как :

 DataClass *obj=[DataClass getInstance];  
  

И используйте массивы.
Таким образом, вы можете назначать данные, не нарушая AppDelegate, что является хорошей практикой.

Комментарии:

1. Да, конечно. Если вы сочтете это правильным, поддержите ответ и примите его :))

2. @Nitish Я пытаюсь использовать ваш пример для создания класса данных, чтобы совместно использовать массив событий календаря между MainViewController и SecondViewController, который, оказывается, представляет собой табличное представление. Как именно я мог бы «настроить» сам массив, чтобы получить к нему доступ с помощью DataClass *obj=[DataClass getInstance]; ?

Ответ №3:

Я написал длинное руководство по таким проблемам в своем блоге:http://www.hollance.com/2011/04/making-your-classes-talk-to-each-other-part-1 /

Вам нужно найти простой способ, позволяющий вашим контроллерам взаимодействовать друг с другом. В моем руководстве объясняется несколько способов сделать это и каковы преимущества и недостатки каждого подхода. Стоит узнать, как это сделать, потому что эта проблема возникает практически в любом приложении, которое вы напишете.