1. Objective C / Говнокод #17902

    −403

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    if (indexPath.row == 0) {
            if (![centerViewController isKindOfClass:[T7DUserInfoViewController class]]) {
                T7DUserInfoViewController *userViewController = [[T7DUserInfoViewController alloc] init];
                [navigationController popViewControllerAnimated:NO];
                [navigationController pushViewController:userViewController animated:NO];
            }
        }
        if (indexPath.row == 1) {
            if (![centerViewController isKindOfClass:[T7DMapViewController class]]) {
                T7DMapViewController *mapViewController = [[T7DMapViewController alloc] init];
                [navigationController popViewControllerAnimated:NO];
                [navigationController pushViewController:mapViewController animated:NO];
            }
        }
        if (indexPath.row == 2) {
            if (![centerViewController isKindOfClass:[T7DOrderListViewController class]]) {
                T7DOrderListViewController *orderListViewController = [[T7DOrderListViewController alloc] init];
                [navigationController popViewControllerAnimated:NO];
                [navigationController pushViewController:orderListViewController animated:NO];
            }
        }
        if (indexPath.row == 3) {
            if (![centerViewController isKindOfClass:[T7DCurrentOrderViewController class]]) {
                T7DCurrentOrderViewController *orderViewController = [[T7DCurrentOrderViewController alloc] init];
                [orderViewController setOrderType:T7DOrderTypeCurrent];
                [orderViewController setOrder:[T7DOrder currentOrder]];
                [navigationController popViewControllerAnimated:NO];
                [navigationController pushViewController:orderViewController animated:NO];
            }
        }
        if (indexPath.row == 4) {
            if (![centerViewController isKindOfClass:[T7DMessagesViewController class]]) {
                T7DMessagesViewController *messagesViewConroller = [[T7DMessagesViewController alloc] init];
                [navigationController popViewControllerAnimated:NO];
                [navigationController pushViewController:messagesViewConroller animated:NO];
            }
        }
        if (indexPath.row == 5) {
            [self logout];
            return;
        }

    Мудаки.

    Запостил: pr0gl, 31 Марта 2015

    Комментарии (5) RSS

    • вижу только следующее:
      1)if-else работает лучше чем просто if
      2)pop на себя и сразу после этого push вообще работают? Точно не помню, возможно если вызовы сделать анимированными, то работать не будет
      Ответить
      • Проблема куда глубже: вместо того, чтобы устроить нормальную навигацию по экранам с помощью сигов/кода по-месту, тут какой-то левый кусок приложения занимается инициализацией экранов и организации переходов, при том что это вообще не его работа.

        ...И ладно бы всё это, но все эти == x, одинаковый код с разными классами и.т.п. меня вообще добивает. Почему бы не просто не замапить нужные контроллеры на нужные индексы и показывать их одним движением?
        Ответить
        • 1)когда-то не было storyboard и соответственно все пользовались только push и pop
          2)то, что есть segue и storyboard - еще не значит, что они во всех отношениях лучше push и pop. Например, когда вы используете push и pop, то код инициализации у вас аккуратно лежит в одном месте, обычно вместе с этими вызовами. В случае с segue - у вас инициализация размазана по коду и скорее всего еще залезла на storyboard (имею в виду указание id перехода).
          3)опять же можно заменить для данного конкретного случая. А если у вас инициализация - не просто init..., а initWith..., причем разная для разных контроллеров? Максимум объединить вызовы push/pop

          P.S. вдогонку к 2) - существуют библиотеки вроде reactive cocoa или promise kit, которые собирают распределенный код в одном месте/вызове
          Ответить
          • 1) Потому я и написал про "код по месту", потому что это тоже вариант.
            2) >>а initWith...
            Если у ваших контроллеров верхнего уровня (которые вы пушите) сложная инициализация - вы что-то делаете не так, контроллер он же не вьюшка, контроллер может данных для себя и сам набрать. Не зря же модели придуманы, верно?
            >> В случае с segue - у вас инициализация размазана по коду
            Так и хорошо же, каждому экрану лучше знать куда он ведёт и, соответственно, как и что инициализировать.

            P.S. reactive cocoa решает не совсем эту задачу, на самом деле.
            Ответить
            • если вы про mvc, то apple ее пропагандирует и одновременно нарушает в своих примерах - например, хранит данные внутри контроллера.
              >>Так и хорошо же, каждому экрану лучше знать куда он ведёт и, соответственно, как и что инициализировать.
              Так экрану хорошо и с push/pop, вот только программисту не особо весело прыгать по коду выискивая инициализацию.

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

    Добавить комментарий