NSString не будет передаваться между классами

#iphone #objective-c #ios #view

#iPhone #objective-c #iOS #Вид

Вопрос:

Я пытаюсь заставить это работать, позвольте мне объяснить, что я пытаюсь сделать, а затем я покажу некоторый код. Хорошо, итак, у меня есть UITableView с контроллером навигации, когда вы выбираете строку, он загружает подробное представление.

Я создал строку, которая будет содержать выбранную строку, чтобы я мог знать, что отображать в представлении. Строка не будет передаваться между этими двумя классами и просто выдает значение null, даже когда я пытаюсь NSLog строку в другом методе в том же классе, она все равно выдает значение null, единственное место, где она будет фактически отображать то, что внутри нее, — это метод, в котором она была создана.

Позвольте мне показать вам некоторый код, я пробую разные способы сделать это, и оба выходят с нулевым первым классом.h

 @interface features : UITableViewController{

NSMutableArray *featuresTableViewSet;

NSString *selectedFeature;
}

@property (nonatomic, retain) NSMutableArray *featuresTableViewSet;
@property (nonatomic, retain) NSString *selectedFeature;

-(NSString *)get;
@end
  

первый класс.м

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
{
selectedFeature = [[NSString alloc]init];
selectedFeature = [featuresTableViewSet objectAtIndex:indexPath.row];


// Navigation logic may go here. Create and push another view controller.

 features_detail *detailViewController = [[features_detail alloc]     initWithNibName:@"features_detail" bundle:nil];
 // ...
 // Pass the selected object to the new view controller.
 [self.navigationController pushViewController:detailViewController animated:YES];



}

-(NSString *)get{
NSLog(@"%@", selectedFeature);
return selectedFeature;
}
  

Теперь вот класс, в котором я пытаюсь использовать строку в

i #import "features.h" из первого класса во второй

вот .m для второго класса

 - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

features *selected = [[features alloc]init];

self.title = selected.selectedFeature;

NSLog(@"%@", [selected get]);

NSLog(@"%@", selected.selectedFeature);
}  
  

Одна из двух вещей, которые я делаю, должна работать правильно?

Спасибо 🙂

Ответ №1:

О, нет, это так не сработает. Вы должны создать свойство NSString в файле detail view class .h:

 @interface features_detail : <bla-blaController> {

NSString *selectedFeature;

}

@property (nonatomic, retain) NSString *selectedFeature;
  

После создания экземпляра DetailViewController вы можете инициализировать это свойство значением, полученным из таблицы, а затем нажать на контроллер:

 features_detail *detailViewController = [[features_detail alloc]     initWithNibName:@"features_detail" bundle:nil];
 //pass it like this:
 detailViewController.selectedString = selectedFeature;

 [self.navigationController pushViewController:detailViewController animated:YES];

// Now don't forget to release the controller you've pushed:
[detailViewController release];

//Oh, and you need to release the string as well:
[selectedFeature release];
  

Это поможет избежать утечки памяти из-за неизданного объекта.

Кстати, здесь вам не нужен get метод.

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

1. Ты гений. Теперь работает идеально, спасибо!

Ответ №2:

В методе viewDidLoad() класс features_detail создает совершенно новый экземпляр класса features. Новый экземпляр будет иметь начальное поле selectedFeature; оно не будет содержать значение, которое вы установили при нажатии на строку таблицы.

Вот альтернатива, пусть класс features_detail имеет поле с именем selectedFeature. После создания экземпляра класса features_detail в методе didSelectRowAtIndexPath передайте выбранную функцию этому экземпляру.

Это будет выглядеть примерно так:

 detailViewController.selectedFeature = selectedFeature;
  

Таким образом, вы передаете то, что выбрано из класса features, в класс features_detail. (Кроме того, в вашем коде есть некоторые проблемы с управлением памятью, которые мы можем решить после решения основной проблемы)

Ответ №3:

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