2014-02-13 3 views
0

В моем приложении у меня есть несколько контроллеров с массивами и функциями поиска. Эти массивы отображаются в таблицах, и поиск работает отлично.Панель поиска для UITableView как подвид UIViewController

ОДНАКО, Я пытаюсь создать универсальный поиск на главной странице моего приложения. Это будет искать ВСЕ массивы (я не против комбинировать их как один массив в главном редакторе представления страницы). Я пробовал много способов добиться этого, но продолжаю ударять блоки. Самое дальнее, что у меня есть, это поиск в поисковой строке, но затем он падает каждый раз, когда я пытаюсь выполнить поиск.

У меня нет никакого кода для показа, поскольку у меня нет ничего, что сработает. Может ли кто-нибудь указать мне в правильном направлении, чтобы выполнить это? Любые учебники и т. Д.?

Основной учебник я использовал, чтобы настроить несколько отдельных страниц: http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view

EDIT: Я добавил изображение, чтобы продемонстрировать то, что мне нужно.

У меня есть 3 UITableViews, все доступные кнопки просмотра из главного UIViewController. Каждый UITableView тогда имеет связанный с ним массив сам по себе, Tableview массив 2, 3 и 4.

панель поиска 2 поиск через TableView массив 2 Строка поиска 3 ищет в TableView массив 3 Search Bar 4 поиск через TableView массив 4

Теперь у меня есть панель поиска 1 на основном UIViewController. Я хочу, чтобы эта строка поиска просматривала ВСЕ массивы (2, 3 и 4). Я не против комбинировать все данные массива в одном массиве, который присутствует в файле UIViewController, но я не могу найти способ заставить поиск работать.

Изображение: http://s14.postimg.org/o5z1e5j75/Untitled_1.png

+0

В чем принципиальное отличие между поиском в 1 массиве или двух или трех? – Andy

+0

Извините, я не понял, что вы имеете в виду? –

+0

Я пытаюсь понять, в чем проблема, если у вас есть рабочий поиск для каждого отдельного массива данных, но удары по блокам при поиске по всем трем из них. В этот момент очень сложно что-то предложить, поскольку кода нет. – Andy

ответ

0

Как я понял, вам нужен единый универсальный implementaion поиска и отображения контента из 3-х различных массивов. Итак, в этом случае я обычно создаю базовый класс контроллера, который будет иметь панель поиска и tableView, всю функцию поиска и указатель на массив данных. набрав прямо в браузере, поэтому могут быть ошибки.

@interface BaseListController : UIViewController 
{ 
UITableView* _tableView; 
UISearchBar* _searchBar; 
} 
@property NSArray * source; 
@poperty (readonly) NSArray * founded; 
@end; 

чем, вы должны убедиться, что объекты из всех 3-й массивов поддержат специальный интерфейс испытующи:

@protocol SearchedItem <NSObject> 
@required 
- (NSString *)searchKey; 
@end 

после этого вашей методы поиска будет выглядеть следующим образом:

- (void)searchForKey:(NSString *)searchText 
{ 
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"searchKey contains[cd] %@", searchText]; 
_founded = [self.source filteredArrayUsingPredicate:predicate]; 

[_tableView reloadData]; 
} 

EDIT:расширенный ответ, как и почему необходимо использовать @protocol

Прежде всего, прочитайте this aticle, в нем четко объясняется, как использовать @protocol.
Я до сих пор не знаю, что вы будете хранить в этих трех массивах. Но скажем, вы сохраните объекты из 3 разных классов, наследуемых fom NSObject, и позвоните им Chapter, Recipe и Ingredient. Каждый из них будет иметь свои собственные уникальные имена. А для обработки их смесей независимо эти классы должны иметь что-то общее. Это обычная вещь будет единым интерфейсом - все они должны соответствовать вашему определенному @protocol.Это означает, что это не относится к классу этого объекта, но вы можете быть уверены, что он будет реагировать на метод вызываемого протокола. Пример кода:

// .h file 
@interface Chapter : NSObject <SearchedItem> 
@property NSString * chapterName; 
@property NSArray * recipes; 
@end 

@interface Recipe : MSObject <SearchedItem> 
@property NSString * recipeName; 
@property NSArray * ingredients; 
@end 

@interface Ingredient : NSObject <SearchedItem> 
@property NSString * prettyName; 
@property NSNumber * enoughCount; 
@end 

// .m file There you must implement protocol's requied method! 
@implementation Chapter 
- (NSString *)searchKey{ 
return self.chapterName; 
} 
@end 

@implementation Recipe 
- (NSString *)searchKey{ 
return self.recipeName; 
} 
@end 

@implementation Ingredient 
- (NSString *)searchKey{ 
return self.prettyName; 
} 
@end 

так что теперь, в методе cellForRowAtIndexPath: вы можете легко получить заголовок строки, не зная, что данные, которые вы в настоящее время показывают:

id<SearchedItem> item = self.source; //self.founded 
cell.titleLabel.text = [item searchKey]; 

P.S. если вы храните простые NSStrings в своих массивах, вам не нужны никакие протоколы

+0

Спасибо за ответ. Не могли бы вы предоставить мне больше информации с точки зрения кода? Я относительно новичок в этом и просто не уверен в части 3 массивов. Где я включаю этот код? В базовом контроллере или в отдельных таблицах с их массивами? –

+0

В принципе, весь код должен быть в базовом контроллере. Затем вы можете создать 3 экземпляра этого класса и просто установить 3 разных массива объектов. Или создайте 3 подкласса этого базового класса, но вы должны это сделать, если только вы хотите настроить свой TableView с разными ячейками или этот viewController будет иметь редко различное поведение. –

+0

Хорошо, что имеет смысл. Не могли бы вы просто объяснить этот бит немного больше @protocol бит немного больше? –

Смежные вопросы