Как передать NSString через 3 ViewControllers? - PullRequest
0 голосов
/ 04 мая 2010

эй, в настоящее время я использую iPhone SDK и у меня возникают проблемы при передаче NSString через 3 просмотра

Я могу передать строку NSSt между двумя контроллерами представления, но не могу передать ее через другой. Мой код выглядит следующим образом ...

    `- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)index`Path {

 NSString *string1 = nil;

 NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
 NSArray *array = [dictionary objectForKey:@"items"];
 string1 = [array objectAtIndex:indexPath.row];


 //Initialize the detail view controller and display it.
 ViewController2 *vc2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:[NSBundle mainBundle]];
 vc2.string1 = string1;
 [self.navigationController pushViewController:vc2 animated:YES];
 [vc2 release];
 vc2 = nil;
}

в реализациях "ViewController 2" я могу использовать "string1" в строке заголовка, выполнив следующее ....

    - (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = string1;
 UIBarButtonItem *addButton = [[[UIBarButtonItem alloc]
           initWithImage:[UIImage imageNamed:@"icon_time.png"] 
           style:UIBarButtonItemStylePlain
           //style:UIBarButtonItemStyleBordered
           target:self
           action:@selector(goToThirdView)] autorelease];
 self.navigationItem.rightBarButtonItem = addButton;

    }

но у меня также есть кнопка NavBar на правой стороне, которую я хотел бы нажать на новое представление

- (void)goToThirdView 
    { 
     ViewController3 *vc3 = [[ViewController3 alloc] initWithNibName:@"ViewController3" bundle:[NSBundle mainBundle]];

     [self.navigationController pushViewController:NESW animated:YES];
     vc3.string1 = string1 ;
     [vc3 release];
     vc3 = nil;
}

Как передать эту же строку в третье представление? (или четвертый)

Ответы [ 2 ]

1 голос
/ 04 мая 2010

То, что у вас есть, должно работать, за исключением того, что вы хотите установить строку в vc3 перед тем, как поместить ее в стек, чтобы она присутствовала при отображении вида и навигационной панели. Вот как у вас это в vc2 работает.

Тем не менее, с точки зрения дизайна приложения, плохая практика - передавать значения непосредственно между контроллерами представления. В идеале вы хотите, чтобы ваши контроллеры представления были автономными и могли функционировать независимо от того, какой другой контроллер делал или не предшествовал ему. (Это становится действительно важным, когда вам нужно возобновить приложение до того места, где оно было прервано.) Если сделать контроллеры представления взаимозависимыми, ваше приложение будет становиться запутанным и сложным по мере его увеличения.

Лучший способ обмена данными между представлениями - это хранить данные в общедоступном месте. Если это информация о состоянии приложения, укажите ее по умолчанию или вы можете указать атрибут делегата приложения. Если это пользовательские данные, то они должны быть в выделенном объекте модели данных (который является одноэлементным или доступен через делегат приложения).

0 голосов
/ 04 мая 2010

Вы можете найти пример кода из вопроса , который я задавал ранее.

...