#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, после чего вы можете использовать.