2012-10-16 2 views
1

Xcode, похоже, не находит свойства данного UITableViewController, хотя я импортирую его, и они кажутся правильно определенными на классе.«свойство не найдено на объекте типа» ошибка в prepareForSegue пытается отправить параметры в следующий контроллер представления таблицы

Я попытался очистить, удалить производные данные, перезапустить XCode и построить снова, ничто из этого не работает. Также попытались получить доступ к собственности через сеттер.

Это мой код:

MasterViewController.m

#import "DetailTableViewController.h" 
... 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"nextScreen"]) { 
    DetailTableViewController *detailTableViewController = [segue destinationViewController]; 
    NSInteger tagIndex = [(UIButton *)sender tag]; 
    detailTableViewController.productType = tagIndex; 

    /*[detailTableViewController setProductType:tagIndex];*/ //This does not work either. 
} else if ([[segue identifier] isEqualToString:@"anotherSegue"]){ 
    MyLoginViewController *loginViewController = [segue destinationViewController]; 
    loginViewController.delegate = self; //Funnily enough, this one works 
} 
} 

DetailTableViewController.h #import

@interface DetailTableViewController : UITableViewController<UITableViewDelegate, UITableViewDataSource> { 
    NSInteger *productType; 
} 

@property (nonatomic) NSInteger *productType; 

@end 

DetailTableViewController.m

@implementation DetailTableViewController 

@synthesize productType = _productType; 
... 

редактировать: ошибка приходит в эту линию:

detailTableViewController.productType = tagIndex; 

Кто-нибудь есть идея о том, почему это могло произойти? Спасибо!

Обновлено:

Похоже, это что-то связано с тем, как XCode ссылается мои файлы, это действительно странно:

  • Когда я Cmd + щелчок на detailTableViewController (тот, где я создаю мой экземпляр) он принимает меня к реальному коду:

    detailTableViewController *detailTableViewController = [segue destinationViewController]; 
    
  • Но когда я Cmd + щелчок на чертенка ort line, это приводит меня к некоторому интерфейсу с тем же именем, что и мое, и тому же объявлению, за исключением того, что у него нет никаких свойств, которые имеет мой код.

    #import "DetailTableViewController.h" 
    

Кто прошел через тот же вопрос?

+0

Просто хотелось подчеркнуть, что при создании объекта, ссылающегося на DetailTableViewController, функция автозаполнения не находит каких-либо свойств этого класса, как противоположна LoginController, где находит свойство делегирования. –

+0

Итак, у вас должно быть два класса с одним и тем же именем, плавающим вокруг, вы это проверили? поэтому автозаполнение не сможет также найти свойства класса. проверьте свою файловую структуру и убедитесь, что у вас нет дубликатов. – jere

+1

Спасибо @jere, вы были правы, и вот что случилось, файл был дважды в файловой системе по какой-то причине, я понял, что сразу после публикации обновления. Благодаря! –

ответ

3

Решенный!

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

Не могу понять, почему это произошло, или же я продублировал файл без намерения, но теперь он отлично работает.

Спасибо вам всем за ваши ответы!

+1

спасибо - мне это помогло. – heLL0

0

Назовите ваш контроллер детали чем-то другим, чем класс (довольно очевидно).

detailTableViewController *detailTableViewController 

для:

detailTableViewController *detailTable 
+0

Ну, на самом деле соглашение об именах, которое я использую в коде, не так, как я его написал, поэтому имя было уже другим, поэтому это не решило проблему, но спасибо! –

0

встроено detailTableViewController в навигации контроллер?Если да, то вам необходимо открыть его таким образом:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"nextScreen"]) { 
    UINavigationController *nc = segue.destinationViewController; 
    DetailTableViewController * detailTableViewController = [nc.viewControllers objectAtIndex:0]; // First view in nav controller 
    NSInteger tagIndex = [(UIButton *)sender tag]; 
    detailTableViewController.productType = tagIndex; 
} 
+0

Вы правы на части контроллера навигации, но я пробовал это (с правильным индексом, который равен 1), но все еще не работает. Он также встроен в контроллер панели вкладок. –

+0

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

+0

@ mr-cairo Я просто обновился с нечетным поведением XCode, связанным с проблемой. Было бы очень признательно, если бы вы могли взглянуть и сообщить мне свои мысли об этом. Благодаря! –

0

Вы должны бросить [segue destinationViewController] на любой тип контроллера вам нужно, так как этот метод возвращает общий UIViewController (он не знает, какой тип класса вы хочу, чтобы это было, вот почему вам нужно его отливать)

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"nextScreen"]) { 

     // cast destinationViewController to DetailTableViewController 
     DetailTableViewController *detailTableViewController = (DetailTableViewController*)[segue destinationViewController]; 
     NSInteger tagIndex = [(UIButton *)sender tag]; 

     detailTableViewController.productType = tagIndex; 

    } else if ([[segue identifier] isEqualToString:@"anotherSegue"]) { 

     // cast destinationViewController to MyLoginViewController 
     MyLoginViewController *loginViewController = (MyLoginViewController*)[segue destinationViewController]; 
     loginViewController.delegate = self; 

    } 
} 

Это должно сделать трюк.

+0

Спасибо за подсказку, но это не сработало. Во втором случае (Login (он отлично работает с параметром делегата, поэтому я не думаю, что это проблема, но в любом случае это хорошая конвенция. Спасибо! –

+0

Можете ли вы разместить соответствующий код для вашего 'DetailTableViewController'? class? – jere

+0

Из-за соглашений о конфиденциальности мне не разрешено полностью раскрывать код, но, как вы видите, это просто TableViewController с тремя свойствами NSArray, который он использует (и они работают), и теперь мне нужно добавить это свойство NSInteger. Он по-прежнему отлично работает в приложении, но не тогда, когда я пытаюсь отправить параметр из предыдущего ViewController. Я не уверен, что это может что-то делать, но я переместил код в другое место, а DetailViewController это внутри группы, но MasterViewController и LoginViewController не являются. –