2015-12-17 3 views
1

Я не знаю, задавался ли этот вопрос раньше, но я не могу найти его.iOS 9 UIAlertView теперь устарел и заменен на UIAlertController, как показать его на UIView, так как представление не имеет метода presentViewController

С IOS 9 UIAlertView устарела, и мы должны использовать UIAlertController, теперь, как это контроллер, а не смотреть больше, мы должны представить его на какой-то другой контроллер.

Так что мой вопрос здесь, что если у меня есть UITableViewCell, который имеет UIButton и его действия я хочу, чтобы показать предупреждение в этом случае self не будет иметь метод presentViewController как в этом случае UITableViewCell, как мы можем показать предупреждение ,

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

+0

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

+0

@deadbeef thats, что было моим последним утверждением, почему я должен добавить слабого делегата, чтобы показать информативное сообщение. Надеюсь, теперь никто не согласен с тем, что оповещения могут также отображаться для информационных сообщений! –

+0

Поскольку это работает [MVC] (https://en.wikipedia.org/wiki/Model-view-controller), и UIKit построен с учетом MVC, и использование его по-разному всегда будет для вас болью , С MVC контроллеры управляют всем, что представлено на экране, представления не приседают, они просто показывают материал, который им сказали показать, период. – deadbeef

ответ

3

Вид не должен представлять предупреждение. Имейте контроллер, которому принадлежит представление.

запомнить MVC.

Контроллер должен реагировать на нажатие кнопки, выяснить, какая ячейка отправила его и представить соответствующее предупреждение.

+1

Это звучит хорошо, теоретически и, безусловно, является« чистым »подходом. Однако это не всегда прагматичный подход. Например, у меня есть приложение с ячейкой, которая отображает карту. Я считаю, что лучше хранить логику, содержащуюся в ячейке, а не обрабатывать ее до контроллера представления хоста. Если ячейка используется в нескольких диспетчерах просмотра, разрешения и другие предупреждения должны быть дублированы каким-то образом. – Avi

+1

Я знаю это, но что, если у меня есть прототип ячейки, и на нем есть UIButton, действие находится внутри класса UITableViewCell, теперь у меня не будет метода presentViewController, так как это UITableView Cell? –

+1

@Avi Извините, но предупреждение, представленное сверху контроллера, - это * никогда * бизнес подзаголовка. – Mundi

-1

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

+4

Плохая идея. Ячейка не должна нести ответственность за предоставление предупреждений! – Mundi

+0

Когда дело доходит до выбора между разделением проблем (MVC) и инкапсуляцией, я склоняюсь к инкапсуляции. Я считаю, что это приведет к увеличению количества поддерживаемых кодов в долгосрочной перспективе. Способ, которым я смотрю на это, состоит в том, что оповещения являются частью (под) представления. Так получилось, что API требует выхода за пределы представления, чтобы все было сделано, но это всего лишь несчастный случай. – Avi

+1

Когда камера находится на iPad в popover, все ломается. В этом случае предупреждение, скорее всего, будет представлено по-разному. Это иллюстрирует, что этот подход является проблематичным. – Mundi

-1

В идеале Посмотреть контроллер должен быть ответственным за показ дремали ...

Вы можете просто создать слабую ссылку вашего UIViewController внутри класса Cell и показать оповещения из самой клетки класса

+1

Плохая идея по причинам, изложенным в обсуждении. – Mundi