iPhone development

а в самом табе у меня не получается убрать или поменять title, его можно только поменять в TabBarController как

Я понял твой прикол кажеться. Если я не ошибаюсь у тебя идет NavigationController, в нем есть tabBarController, а в нем соответственно уже какие то другие viewControllerы.

В этом случае твои viewControllerы navigationControllerom никоим образом не видны, так как они не находятся в navigationController.viewControllers, а там есть только один твой tabBarController и только его параметры будут применятся. Тут тебе нужно обращаться к tabbarController и менять его navigationItem и вообще все действия делать через него.

Далее при таком раскладе, свойство navigationController каждого контроллера равно nil и потому при вызове pushViewController ничего не происходит. Тебе нужно выполнять [self.tabBarController.navigationController pushViewController].
Но учитывай, что при этом твой tabBar будет уезжать вместе с остальным содержимым.

Может подскажешь как сделать ссылку из вью, который делает pushViewController во вью которое он пушает ?
В NavigationController.viewControllers есть ссылки на все push - ные viewСontrollerы в порядке, в котором они туда добавлялись. Самым первым будет твой tabBarController
 
Я понял твой прикол кажеться. Если я не ошибаюсь у тебя идет NavigationController, в нем есть tabBarController, а в нем соответственно уже какие то другие viewControllerы.
Все верно, вот только
FirstTabController:
Код:
[[self.tabBarController.navigationController.viewControllers objectAtIndex:0] pushViewController:detailController animated:YES];
Код:
self.tabBarController.navigationController.navigationItem.title = @"NEW title";
не хочет вызываться и меняться, как же тогда быть ? может заменить это дело как-то тулбаром. Ведь есть же приложения с такой структорой как у меня. :confused:

По идее можно вначале сделать TabBarApplication, а просто для первых видов (Welcome, Login) прятать его ?
 
[[self.tabBarController.navigationController.viewControllers objectAtIndex:0] pushViewController: detailController animated:YES]

неправильно, правильно
[self.tabBarController.navigationController pushViewController: detailController animated:YES];

push - это метод NavigationController. При этом NavigationController сам добавляет следующий контроллер во viewControlers

self.tabBarController.navigationController.navigationItem.title = @"NEW title";
- тоже неправильно.
правильно - self.tabBarController.navigationItem.title = @"NEW title";
 
Это тоже пробывал, но не проходит так тоже, title не меняется, и push не происходит :(
 
тогда тут может быть другой прикол, у тебя tabBarController в чистом виде добавлен в NavigationController или он у тебя лежит еще на какой то вьюхе какого-то контроллера?

Я видел у тебя в постах выше примерно такую структуру [self.view addSubView tabBarController.view]. Что такое здесь self?

Если второй вариант, то у тебя в NavigationController.viewControllers лежит не TabBarController, а тот что self предложением выше. Это не очень удачная конструкция, в этом случае тебе нужно в твоих placeHolder создавать ссылку на self и через нее обращаться к NavigationController.

Вообще я бы тебе посоветовал подебажить это дело, сделай где нибудь контрольную точку после того, как все создано и посмотри адреса, тогда тебе станет все понятно: что куда ссылается и чего не хватает. Если адрес равен 0*0 - это nil.
 
self - это TabBarController : UITabBarController <UITabBarControllerDelegate>.

я решил все переделать, т.к. уж жудко все проблемно получается, я сделал на этот раз один TabBarController, где положил 4 таба - Navigation controller, все работает как по маслу, вот только вопрос:
1. Если у меня один таб бар (WelcomeView например), который внутри себя переходит по pushViewController на LogInViewController, где вводятся логин и пароль. Так вот как возможно по вводу и валидации пароля с логином, скрыть/удалить таб WelcomeView и добавить/показать остальные табы.
2. Например я хочу сделать logout, то сделать наоборот (ну мне хотя бы как примерное [1], а там я сам разберусь).

Что же касается дебага, то к этому делу нужно привыкать и привыкать, уж жудко он какой-то не удобный (например, по сравнению с java Eclipse IDE, Idea IDE).

Спасибо большое ;)

Ой, еще забыл, есть например tableView, так вот как можно сделать что при клике на записи (например Feedback) открывался таб Feedback ?

Вот это после таких вопросов, база данных знаний форума пополнится :)

тут ничем не могу помочь, т.к. interface builderом пользоваться не приходилось

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

Итак :
1) SomeTabBarController
@interface SomeTabBarController: UIViewController
{
UITabBarController *tabBarController_;
UIViewController *someContr1_;
UIViewController *someContr2_;
}
@End

@implementation SomeTabBarController
- (id) init
{
if(self = [super init])
{
tabBarController_ = [ [UITabBarController alloc] init];
SomeContr1_ = [ [SomeController alloc] init];
SomeContr2_ = [ [SomeController alloc] init];

[SomeContr1_ setRootController_: self];
[SomeContr2_ setRootController_: self];
tabBarController_.viewControllers = [NSArray arrayWithObjects: SomeContr1_, SomeContr2_, nil];
[SomeContr1_ release];
[SomeContr2_ release];
self.view = tabBarController_.view;
}
return self;
}
...
@End

2) SomeController

@Class SomeTabBarController
@interface SomeController : UIViewController
{
...
SomeTabBarController *RootController_;
}

@property(nonatomic, assign) SomeTabBarController *RootController_;
@End

@implementation SomeController

@syntesize RootController_;
...
- (void) viewWillAppear: (BOOL) animated
{
self.RootController_.Title = @"Some Title";
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd
target: self
action: @selector(someselector)];

self.RootController_.navigationItem.rightBarButtonItem = rightBarButtonItem;
[rightBarButtonItem release];
[super viewWillAppear: animated];
}
...
@End

3) запуск окна TabBarController
...
MyController = [ [SomeTabController alloc] init];
[self.navigationController pushViewController: MyController animated: YES];
[MyController release];
...

В 3) self не имеет значения - это вызывающий класс

В общем идея этого всего в ссылке RootController_, через который происходит взаимодействие с NavigationController.
 
Интересное решение конечно, я сейчас так класно сделал в своей аппликухе, когда первый контроллер - таббар контроллер, единственное нужно разобраться как их показывать/скрывать и я в шоколаде :-), ну или как минимум сделаю что хочу :).

кстати, а ты не подскажешь как можно открыть / активировать вкладку таб бара программно, например, я залогинился и теперь мне нужно вроде push на конкретную вкладку TabBarView ?
 
Привет, есть вопрос: как можно сделать прокрутку чтобы внутри вью был UIImage, UITextView ?
 
не совсем понял, какая должна быть прокрутка. UITextView имеет свою прокрутку.
UIImage можно положить внутри UIScrollView.
 
Да у меня идея, я положил внутрь UIScrollView рисунок и UITextView, но проблема в том что UITextView имеет свой scroll, а мне нужно чтобы он растягивался по содержимому по высоте и при этом вылазил за рамки экрана.
Вид такой:
UIScrollView
--UIImageView
--UITextView

картинка находится вверху экрана, текст должен выходить за рамки экрана вниз.

Чтобы когда я пытался прокручиваться у меня прокручивался и картинка (уходила вверх) и текст двигался вверх
 
так выключи скроллинг в UITextView или вообще userInteractionEnabled отключи. Но UITextView по моему ты бесконечно не растянешь. Он контент кусками рендерит - страницы 2-3 максимум. Не проверял, но по крайней мере в UIWebView так.
 
все верно, отключил, все растянулось, но скролинг в UIScrollView не появился, хотя включены userInteractionEnabled, scrolling = enabled, все это в Interface Builder

хотя я не думаю что должна быть какая то разница, так или иначе я могу получить доступ в коде к UIScrollerView, вот почему скролинга не появляется, разбираюсь
 
Ленин, можешь подсказать.
Ты привел пример создания TabBarControllera с двумя вкладками. Каким образом можно задать расположение картинки и текстана кнопке Таббар контроллера? Если я в UIViewController вот так задаю текст self.title = @"Settings"; и аналогичным образом картинку. То на кнопке Таббарконтроллера появляется этот текст с картинкой только картинка сверху, а текст снизу. Мне надо, чтобы картинка была слева, а текст справа.
И еще такой вопрос. Возможно ли заменить на всплывающей клавиатуре текст правой нижней кнопки и еще желательно цвет.
 
То на кнопке Таббарконтроллера появляется этот текст с картинкой только картинка сверху, а текст снизу. Мне надо, чтобы картинка была слева, а текст справа.

на вряд ли, лучше уже картинку с текстом сразу нарисовать

Возможно ли заменить на всплывающей клавиатуре текст правой нижней кнопки и еще желательно цвет

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



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

Спасибо. Я вот сейчас наткнулся на одни грабли. Можешь объяснить как от них избавиться? Я понимаю, что в одном месте делаю чушь, но как правильно сделать не знаю. Вот в чем проблема.
Допустим мне в программе нужно сделать переход между несколькими окнами UIViewController. Как я это сделал. Я создал класс в котором есть метод SwitchViews. Вот приблизительный код этого метода
- (void)switchViews: (int)iGoingViewController comin:(int)iCominViewController//Переключение между окнами
{

UIViewController *coming = nil;
UIViewController *going = nil;
switch(iGoingViewController)
{
case 1:
{
coming = loginPage;

break;
}
......
}
switch(iCominViewController)
{
case 1:
{
going = loginPage;
break;
}
....

}

[coming viewWillAppear:YES];
[going viewWillDisappear:YES];
[going.view removeFromSuperview];
[self.view insertSubview: coming.view atIndex:0];
[going viewDidDisappear:YES];
[coming viewDidAppear:YES];
}

Смысл этого класса заключается в следующем. Он создает объекты всех окон. Сохраняет в каждый класс указатель на себя. Потом из любого класса вызывая метод switchViews и у нас происходит переход между любыми двумя окнами. Мы отправляем номер окна которое хотим скрыть и которое хотим показать.
Может метод немного геморойным. Главное то что мне все понятно.
И вот проблемы у меня начались когда я захотел менять окна внутри UITabBarController. Понятное дело, что когда идет переход между вкладками я не вмешиваюсь. Но вот к примеру когда я перешел на вторую вкладку на появившемся окне есть какаето кнопка. Нужно при нажатии на эту кнопку отобразить на второй вкладке какоето другое окно. Когда я пытаюсь это сделать при помощи описанного выше способом то переход происходит, но я немогу на нем ничего делать. Как можно от этого избавиться? Я догадываюсь почему оно глючит. Я же при инициализации UITabBarController указал два UIViewControllera. А тут пытюсь вместо одно тулить третий. В итоге он подменяет только картику.
Вот прилагаю Исходный код. Что должно произойти.
Нажимаем кнопку Login. Переходим на страницу с UITabBarController. Потом переходим на вторую вкладку. После этого нажимаем кнопку два на представлении. Появляется другое представление с кнопкой 3. И вот надо чтобы при нажатии на кнопку 3 происходило какое нибудь действие.
 
Ну тут я если честно не знаю что сказать. Просто идея создавать сразу все контроллеры не очень удачная. Причину дефекта ты указал правильно, получается, что ты меняешь только вьюхи, а контроллеры остаются старые, причем ты вьюхи добавляешь к главному окну контроллера, которое в общем то к таб-бару имеет довольно косвенное отношение + в нем храняться контроллеры для всех табов. При нажатиии на кнопку приложение просто закрывает старое окно новым.

Я бы тебе посоветовал для каждого таба сделать объявить свой контроллер, который будет манипулировать своим окном (view). И у него будет метод вроде switchView. Таким образом иерархия табов не будет нарушена. В таком контроллере можешь объявить хоть список из 100 других контроллеров и при свитче делать что - то вроде self.view = viewController28.view.

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

Если тебе важен именно этот вариант - поманипулируй с tabBar.viewControllers. При каждом вызове метода switchViews переопределяй этот массив. Но тогда тебе придется вести четкий учет всех контроллеров и табов: Этот массив нельзя отредактировать - его нужно заменить новым, т.е. все контроллеры и их положение из этого места программы должны быть известны.

Удачи, надеюсь чем-то помог
 
Ну тут я если честно не знаю что сказать. Просто идея создавать сразу все контроллеры не очень удачная. Причину дефекта ты указал правильно, получается, что ты меняешь только вьюхи, а контроллеры остаются старые, причем ты вьюхи добавляешь к главному окну контроллера, которое в общем то к таб-бару имеет довольно косвенное отношение + в нем храняться контроллеры для всех табов. При нажатиии на кнопку приложение просто закрывает старое окно новым.

Я бы тебе посоветовал для каждого таба сделать объявить свой контроллер, который будет манипулировать своим окном (view). И у него будет метод вроде switchView. Таким образом иерархия табов не будет нарушена. В таком контроллере можешь объявить хоть список из 100 других контроллеров и при свитче делать что - то вроде self.view = viewController28.view.

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

Если тебе важен именно этот вариант - поманипулируй с tabBar.viewControllers. При каждом вызове метода switchViews переопределяй этот массив. Но тогда тебе придется вести четкий учет всех контроллеров и табов: Этот массив нельзя отредактировать - его нужно заменить новым, т.е. все контроллеры и их положение из этого места программы должны быть известны.

Удачи, надеюсь чем-то помог

Мне так и пришлось сделать. Я для каждой закладки сделал класс. переключатель. По поводу кучи окон. Можно создавать только видимое окно. При переключении смотреть созданное ли окно на которое надо переключить если нет создавать. И после переключения удалять окно которое стало неактивным.

Ленин, можешь посмотреть на этот скрин и сказать возможно ли это все сделать с NavigationItem. Если не возможно то как такое можно реализовать? Вот скрин. Я говорю только о верхней панельки. Меня больше всего смущают две кнопки справа вверху.
 

Вкладення

  • пример.png
    пример.png
    72.7 КБ · Перегляди: 103
Останнє редагування:
Ленин, можешь посмотреть на этот скрин и сказать возможно ли это все сделать с NavigationItem. Если не возможно то как такое можно реализовать? Вот скрин. Я говорю только о верхней панельки. Меня больше всего смущают две кнопки справа вверху.

С NavigationItem в принципе сделать можно, но тут могут грабли возникнуть. Там есть свойство titleView - оно равно nil по умолчанию. Если же ему задать какую нибудь вью, то NavigationController подхватит ее и не будет генерировать navigationBar автоматически.

т.е. можно самому взять какой нибудь UIView понатыкать на него кнопок, надписей и поставить туда. Возможные грабли: кнопка back, не знаю отобразиться она сама или нет (не помню, вроде должна), возможно ее придется делать самому, то же самое касается title (а его скорее всего не будет, но там не проблема UILabel добавить).
 
Последний вопрос. Как на обычную View кинуть кнопку нестандартной формы? В нанном случае это кнопка back на моем скрине.
 
Назад
Зверху Знизу