Как передать данные в условном раскладе?
Я пытаюсь построить RSS-ридер. На странице "Добавление канала", если я нажму кнопку "Добавить", я надеюсь проверить, успешно ли добавлен канал. Если он добавлен, то запускайте переход и возвращайтесь на главную страницу. Если он не добавлен, оставайтесь на текущей странице.
Я знаю, что могу создать IBAction на кнопке "Добавить" и проверить, добавлен ли канал. Однако есть два требования, которым я должен соответствовать, чтобы добавить канал.
Во-первых, после того, как я проанализирую URL, мне нужно знать, могут ли результаты анализа генерировать фид. Чтобы разобрать URL, мне нужно использовать метод, определенный в mainViewController.
Во-вторых, мне нужно проверить, существует ли канал. Если этот канал уже существует, не добавляйте его. Чтобы проверить это, мне нужно получить данные фида из mainViewController.
В настоящее время я использую prepareForSegue для передачи данных из основного viewController в это представление. Но для условного перехода, я не знаю, как передать данные и проверить, существует ли канал уже. Потому что prepareForSegue используется только тогда, когда будет запущен переход. Если сеанс не вызван, я не могу проверить состояние.
Кроме segue, есть ли другие способы передать данные из другого представления?
Я не знаю, цель-C, поэтому было бы лучше, если бы вы могли быстро дать мне несколько решений.:)
3 ответа
Как сказал Schemetrical, использование делегата - это простой способ получить доступ к методам вашего MainViewController.
Поскольку вы пометили это как Swift, я также приведу небольшой пример делегата в Swift.
Сначала вы создаете протокол:
protocol NameOfDelegate: class { // ":class" isn't mandatory, but it is when you want to set the delegate property to weak
func someFunction() -> String // this function has to be implemented in your MainViewController so it can access the properties and other methods in there
}
В вашем MainViewController вы должны добавить:
class MainViewController: UIViewController, NameOfDelegate {
// your code
@IBAction func button(sender: UIButton) {
performSegueWithIdentifier("toOtherViewSegue", sender: self)
}
fun someFunction() -> String {
// access the other methods and return it
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "toOtherViewSegue" {
let destination = segue.destinationViewController as! OtherViewController
destination.delegate = self
}
}
}
И последний шаг, вам нужно будет добавить свойство делегата, чтобы вы могли "поговорить" с ним. Лично я представляю, что это свойство является воротами между двумя контроллерами представления, чтобы они могли общаться друг с другом.
class OtherViewController: UIViewController {
weak var delegate: NameOfDelegate?
@IBAction func button(sender: UIButton) {
if delegate != nil {
let someString = delegate.someFunction()
}
}
}
Я предположил, что вы использовали segue для доступа к вашему другому ViewController, так как вы упомянули об этом в своем посте. Таким образом, вы можете просто "поговорить" с вашим MainViewController.
РЕДАКТИРОВАТЬ:
Что касается отдыха. Это также может быть сделано через segue.
- добавлять:
@IBAction func unwindToConfigMenu(sender: UIStoryboardSegue) { }
на ваш MainViewController. - В вашей раскадровке есть 3 иконки в верхней части вашего
OtherViewController
, Нажмите на круглый желтый с квадратом внутри, чтобы убедиться, что выбран ViewController, а не некоторые элементы внутри. - Управляйте перетаскиванием (или перетаскиванием правой кнопкой мыши) от того же круглого желтого с квадратом внутри к правому значку красного квадрата. При этом появляется меню, в котором вы можете выбрать режим раскрутки.
- Нажмите на новую тему, которую вы только что создали. Присвойте ему идентификатор типа "backToMain"
- Добавьте что-то похожее на код ниже
OtherViewController
Кажется, я больше не могу публиковать код?:o добавлю позже.
- (UIViewController*)viewControllerForStoryboardName:(NSString*)storyboardName class:(id)class
{
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
NSString* className = nil;
if ([class isKindOfClass:[NSString class]])
className = [NSString stringWithFormat:@"%@", class];
else
className = [NSString stringWithFormat:@"%s", class_getName([class class])];
UIViewController* viewController = [storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"%@", className]];
return viewController;
}
// get the view controller
ViewController* viewController = (ViewController*)[self viewControllerForStoryboardName:@"MyStoryboard" class:[OtherViewController class]];
// Pass data here
viewController.data = myData;
// or you can push it
[self.navigationController pushViewController:viewController animated:YES];
Вы всегда можете использовать делегатов.
Настройте делегата на странице добавления фида и получите mainViewController
соответствовать делегату. Добавить метод делегата (- (BOOL)canGenerateFeed:(NSURL *)url
) и свойство делегата (@property (weak, nonatomic) id <AddFeedControllerDelegate> delegate
).
Когда ваша страница добавления фида звонит [self.delegate canGenerateFeed:url]
и ваш mainViewController
соответствует делегату, метод в mainViewController
вызывается (это должно ответить BOOL, как указано в объявлении метода). Затем вы можете ответить ДА или НЕТ соответственно, что будет отправлено обратно на страницу добавления фида.