2009-11-12 4 views
1

У меня есть небольшое приложение для какао, а пользовательский интерфейс состоит в основном из одного NSTableView. Однако у меня есть два разных списка данных, которые я хотел бы отображать в нем, а затем просто переключаться между ними. Мой вопрос в том, как вы думаете, лучший способ реализовать это?NSTableView - переключение между 2 источниками данных

Теперь я полагаю, что я могу использовать флаг BOOL, чтобы изменить, какой массив используется в методах dataSource. Но мне также нужно будет изменить класс NSCell, который используется, поскольку списки содержат совершенно разные объекты данных. Затем мне нужно будет перезагрузить таблицу (перезапустим ли [table reloadData] все это надежно?).

Или я мог бы создать 2 отдельных NSTableViews в моем файле NIB и переключить их видимость ... Но это кажется хакерским.

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

Спасибо.

ответ

1

Или я мог бы создать 2 отдельных NSTableViews в моем файле NIB и переключить их видимость ... Но это кажется хакерским.

Это совсем не хаки. Хакерно использовать один и тот же вид таблицы для нескольких наборов разрозненных данных.

Просто создайте tabless NSTabView с двумя вкладками, поставьте один NSTableView на первой вкладке и еще один NSTableView на второй вкладке. Затем вы можете переключаться между видами таблицы, вызывая -selectTabViewItemAtIndex: на NSTabView.

+0

На самом деле это решение, на которое я надеялся. Я все еще изучаю, какие элементы управления пользовательского интерфейса доступны для меня в Cocoa Framework, а табулированный «TabView» (или ViewStack, как он называется в других фреймворках) - именно то, что я хотел использовать. Спасибо, что указал мне на это. – nrj

0

Почему бы не иметь отдельные реализации UITableViewDataSource и UITableViewDelegate и изменить, какие из них указывают на то, когда происходит событие переключения? Похоже, это было бы намного чище, чем наличие всего этого условного кода в одной реализации. Просто потому, что в большинстве примеров UITableViewController реализация обоих этих протоколов не означает, что они не могут быть тремя отдельными объектами.

+0

UITableView не является NSTableView. –

+0

Ох, geez. Ты совершенно прав, Питер. Путь к неспособности понять понимание с моей стороны. Извините, ник! –

+0

С другой стороны, применил бы тот же принцип к классам AppKit? Похоже, что они имеют одну и ту же базовую структуру представления, источника данных и делегата, которые делают классы UIKit? Связаны ли детали оборудования? –

-1

Ответ Sixten Otto является правильным. Тем не менее, если я просто хотел, чтобы взломать вместе то, что работало, я мог бы сделать что-то вроде этого:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (dataSourceOne) { 
    [self cellForRowAtIndexPathDS1:indexPath]; 
    } 
    else { 
    [self cellForRowAtIndexPathDS2:indexPath]; 
    } 
} 

, а затем реализовать две версии cellForRowAtIndexPath. Я уверен, что метод reload data перезагрузит все на экране.

Hackish, но работоспособный.

+0

Нет, ответ UITableView от Sixten Otto - это неправильный ответ на вопрос NSTableView. –

+0

О, хорошо ... не все вопросы какао - это вопросы iPhone. Whooops! –

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