Предотвратите автоматический popToRootViewController на двойном касании UITabBarController

Притянутый Jay Ballou, добавляющим ответ, добавлю я свой ВЈ0.02. Если бы Bruno Ranschaert уже не сделал так, то я упомянул бы статью "Structured Programming with GOTO Statements" Knuth.

Одной вещью, которую я не видел обсужденный, является вид кода, который, в то время как не точно распространенный, преподавался в учебниках Фортрана. Вещи как расширенный диапазон цикла типа DO и открыто кодированных подпрограмм (помнят, это был бы Фортран II или Фортран IV или Фортран 66 - не Фортран 77 или 90). Существует, по крайней мере, шанс, что синтаксические детали неточны, но понятия должны быть достаточно точными. Отрывки в каждом случае в единственной функции.

Примечание, которое превосходные, но датированное (и распроданный) заказывают' Элементы Стиля программирования, 2-й Edn' Kernighan & Plauger включает некоторые реальные примеры злоупотребления GOTO от программирования учебников его эры (последние 70-е). Материал ниже не из той книги, как бы то ни было.

Расширенный диапазон для цикла типа DO

       do 10 i = 1,30
           ...blah...
           ...blah...
           if (k.gt.4) goto 37
91         ...blah...
           ...blah...
10     continue
       ...blah...
       return
37     ...some computation...
       goto 91

Одной причиной такой ерунды была хорошая старомодная перфокарта. Вы могли бы заметить, что маркировки (приятно из последовательности, потому что это было каноническим стилем!) находятся в столбце 1 (на самом деле, они должны были быть в столбцах 1-5), и код находится в столбцах 7-72 (столбец 6 был столбцом маркера продолжения). Столбцам 73-80 дали бы порядковый номер, и были машины, которые отсортируют деки перфокарты в порядок порядкового номера. Если бы Вы имели свою программу на упорядоченных картах и должны были добавить несколько карт (строки) в середину цикла, то необходимо будет повторно перфорировать все после тех дополнительных строк. Однако при замене одной карты материалом GOTO Вы могли бы постараться не повторно упорядочивать все карты - Вы просто подвернули новые карты в конце стандартной программы с новыми порядковыми номерами. Полагайте, что это первая попытка '"зеленых" вычислений' - сохранения перфокарт (или, более конкретно, сохранения перепечатывания труда - и сохранения последовательных ошибок повторного ввода).

, О, Вы могли бы также отметить, что я обманываю и не кричу - Фортран, который IV обычно писался во всем верхнем регистре.

Открыто кодированная подпрограмма

       ...blah...
       i = 1
       goto 76
123    ...blah...
       ...blah...
       i = 2
       goto 76
79     ...blah...
       ...blah...
       goto 54
       ...blah...
12     continue
       return
76     ...calculate something...
       ...blah...
       goto (123, 79) i
54     ...more calculation...
       goto 12

GOTO между маркирует 76, и 54 версия вычисленного goto. Если переменная у меня есть значение 1, goto первая маркировка в списке (123); если это имеет значение 2, goto второе, и так далее. Фрагмент от 76 до вычисленного goto является открыто кодированной подпрограммой. Это была часть кода, выполненного скорее как подпрограмма, но выписанного в теле функции. (Фортран также имел функции оператора - которые были встроены функции, которые соответствовали на одной строке.)

были худшие конструкции, чем вычисленный goto - Вы могли присвоить маркировки переменным и затем использовать присвоенный goto. При поиске с помощью Google присвоенный goto говорит мне, что был удален из Фортрана 95. Запишите на свой счет один для оборота структурного программирования, который, как могли справедливо говорить, запустил на публике с "GOTO Dijkstra Продуманную Вредную" букву или статью.

Без некоторого ведома видов вещей, которые были сделаны в Фортране (и на других языках, большинство которых справедливо оказалось нереально), нам вновь прибывшие трудно понять объем проблемы, с которой имел дело Dijkstra. Heck, я не начинал программировать до десяти лет после того, как та буква была опубликована (но у меня действительно была неудача к программе в Фортране IV некоторое время).

33
задан Matt Long 4 December 2009 в 22:27
поделиться

2 ответа

Use the tabBarController:shouldSelectViewController: method of the UITabBarControllerDelegate protocol.

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    return viewController != tabBarController.selectedViewController;
}

Don't forget to set the delegate of the tab bar controller to the object that actually implements this delegate method.

64
ответ дан 27 November 2019 в 17:48
поделиться

вот что я сделал:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 
{

    if ([[tabBarController viewControllers] objectAtIndex:[tabBarController selectedIndex]] == viewController)

            return NO;

    return YES;

}

касаемо

14
ответ дан 27 November 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: