Повторное использование компонентов в раскадровке

Я новичок в iOS-разработке, имею пару лет опыта работы с Android. Я начал непосредственно с XCode 5 и парадигмы раскадровки. Мне нравится визуальный подход к наброску потока приложения, но ИМХО, он не требует повторного использования компонентов, или, может быть, я не знаю, как это сделать.

У меня есть реальная проблема, которая заключается в следующем: вместо типичного подхода master-detail у меня есть ситуация, в которой щелчок по ячейке TableView вызывает переход к другому TableView, который выглядит так же и ведет себя так же. Есть два конкретных типа TableViewCell, которые я хочу повторно использовать во всем приложении, поэтому я не могу просто дублировать первый TableViewController несколько раз. Мне нужно, чтобы изменения в одном типе TableViewCell были затронуты везде, то же самое для внешнего вида и поведения Tableview. Что-то вроде повторного использования компонента, надеюсь, вы поняли.

Я попытался создать собственный TableView и TableViewCell в отдельном файле xib, подключив его к классу пользовательского контроллера. Тем не менее, когда я хочу повторно использовать этот класс контроллера в раскадровке, я не могу сделать переход от ячейки к следующей, потому что отображаются только контроллеры представления, но не представления внутри.

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

Что бы вы сделали?


person Preslav Rachev    schedule 13.12.2013    source источник
comment
не могли бы вы попытаться быть более конкретным? добавьте код о том, что вы пытаетесь сделать...   -  person sergio    schedule 13.12.2013
comment
Привет. Вы используете только XIB для ячеек? Или у вас также есть пользовательские классы?   -  person Mário Carvalho    schedule 22.01.2014
comment
Добро пожаловать в удивительный мир iOS-разработки! Я бы посоветовал пересмотреть, действительно ли вы хотите использовать раскадровки: stackoverflow.com/questions/9404471/   -  person Johannes Fahrenkrug    schedule 29.01.2014


Ответы (3)


Вы можете сделать программный переход из didselected.....

#импортировать "someVC.h"

Затем, когда вы хотите перейти к новому VC

// Create a VC and remember to set the Storyboard ID of someVC (example someVCID)
someVC *newView = [self.storyboard instantiateViewControllerWithIdentifier:@"someVCID"];

// Can't remember how this works but you can change the Transition method
// newView.modalTransitionStyle = UIModalTransition;

// If you want to pass data, setup someArray in the someVC .h with @property (nonatomic, strong) NSArray *someArray;
newView.someArray = MyLocalArray;

// Animated or not
[self presentViewController:newView animated:NO completion:nil];
person Recycled Steel    schedule 13.12.2013
comment
+1. Это также решение, которое я бы порекомендовал, но просто чтобы не путать OP, я хотел указать, что это вообще не использует переход. Это старый способ использования UINavigationController, когда вы просто создаете экземпляр следующего VC и вручную нажимаете его. Нет ничего плохого в том, чтобы перейти на более низкий уровень, когда переходы не соответствуют вашим потребностям! - person Taum; 22.01.2014
comment
Ну, если OP на самом деле использует UINavigationController, последняя строка должна быть [self.navigationController pushViewController:newView animated:YES] :) - person Taum; 22.01.2014

Если вы пытаетесь выполнить переход к тому же UITableView, вы можете проверить этот ответ с помощью Роб

Я сообщу, что он содержит для полноты:

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

сделать переход от ячейки к контроллеру

Когда вы делаете свой переход, вы получаете:

круговой переход

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

В этом случае есть несколько вариантов:

  1. Как указал Крис, если поддерживается только iOS 6 и выше, используйте описанную выше технику, но (а) убедитесь, что ваш didSelectRowAtIndexPath использует self для sender, а затем shouldPerformSegueWithIdentifier разрешает переход только в том случае, если sender == self (таким образом, когда sender является ячейкой табличного представления, она будет отменена);

  2. Возможно, даже проще: просто вообще не определяйте переход и создайте didSelectRowAtIndexPath вручную instantiateViewControllerWithIdentifier и затем отправьте/представьте этот контроллер представления соответствующим образом; или

  3. Вы можете использовать следующий неуклюжий обходной путь: Короче говоря, добавьте кнопку в контроллер представления (перетащите ее на панель внизу), где она не будет отображаться в представлении, но вы можете использовать ее переходы. . Итак, сначала перетащите круглую кнопку на панель контроллера в нижней части сцены:

    кнопка перетаскивания

    Теперь вы можете перейти от этой кнопки к вашему контроллеру представления:

    сделать переход со скрытой кнопки

    Таким образом, вы снова получаете самореферентный переход:

    переход последней кнопки

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

Ни один из них не идеален, но у вас есть много вариантов.

person Antonio E.    schedule 22.01.2014

ну .. в iOs подумайте об этом по-другому, если бы я был на вашем месте, я бы создал несколько ViewController, даже если они почти одинаковы, и создал бы собственный класс ячеек и заставил бы эту ячейку принимать блок конфигурации. Теперь для каждого ViewController (( или TableViewController)) вы повторно используете свой же пользовательский UITableViewCell и просто передаете ему то, что немного отличается для каждого случая, и, кроме того, вы также можете создать BaseTableViewController, который будет иметь общую конфигурацию, и в каждом ViewController передать пользовательский нужные вам изменения.

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

В любом случае, попробуйте и спросите больше, если вам нужны дополнительные разъяснения.

person Nour1991    schedule 29.01.2014