Правильное создание UISearchDisplayController

Я сделал некоторые поиски, и ответ до сих пор неясен для меня. Я пытаюсь создать экземпляр UISearchDisplayController внутри TableViewController (TVC).

В заголовке моего TVC я объявил searchDisplayController как свойство:

@interface SDCSecondTableViewController : UITableViewController

@property (nonatomic, strong) NSArray *productList;
@property (nonatomic, strong) NSMutableArray *filteredProductList;
@property (nonatomic, strong) UISearchDisplayController *searchDisplayController;

@end

Это приводит к ошибке:

Свойство searchDisplayController пытается использовать переменную экземпляра _searchDisplayController, объявленную в суперклассе UIViewController.

Добавление @synthesize searchDisplayController в файл реализации избавило от ошибок.

Может ли кто-нибудь помочь мне понять эту ошибку? Я использую Xcode 4.6.2, но у меня сложилось впечатление, что свойства автоматически синтезируются, начиная с Xcode 4.4.


person Jdizzle Foshizzle    schedule 28.05.2013    source источник


Ответы (2)


Вы не должны вызывать [self performSelector:@selector(setSearchDisplayController:) withObject:searchDisplayController];, как предложил LucOlivierDB. Это частный вызов API, который приведет к отклонению вашего приложения Apple (я знаю, потому что это случилось со мной). Вместо этого просто сделайте это:

@interface YourViewController ()
    @property (nonatomic, strong) UISearchDisplayController *searchController;
@end

@implementation YourViewController

-(void)viewDidLoad{
    [super viewDidLoad];
    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    searchBar.delegate = self;

    self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    self.searchController.delegate = self;
    self.searchController.searchResultsDataSource = self;
    self.searchController.searchResultsDelegate = self;

    self.tableView.tableHeaderView = self.searchBar;

}

person Thad    schedule 17.08.2013
comment
Не должно быть объявлено свойство searchController, потому что оно будет конфликтовать с уже имеющимся у UIViewController (которое устанавливается внутри инициализации UISearchDisplayController). - person malhal; 29.10.2018

Вы получаете эту ошибку, потому что UIViewController определяет свойство для searchDisplayController. Переопределение другого свойства с именем searchDisplayController в вашем пользовательском классе сбивает компилятор с толку. Если вы хотите определить UISearchDisplayController, создайте экземпляр в - (void)viewDidLoad вашего пользовательского класса.

Пример :

- (void)viewDidLoad
{
    [super viewDidLoad];
    UISearchBar *searchBar = [UISearchBar new];
    //set searchBar frame
    searchBar.delegate = self;
    UISearchDisplayController *searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    [self performSelector:@selector(setSearchDisplayController:) withObject:searchDisplayController];
    searchDisplayController.delegate = self;
    searchDisplayController.searchResultsDataSource = self;
    searchDisplayController.searchResultsDelegate = self;
    self.tableView.tableHeaderView = self.searchBar;
}

Вы можете обратиться к searchDisplayController, используя self.searchDisplayController в своем пользовательском классе.

person LucOlivierDB    schedule 26.06.2013