Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > iOS > Аналог Navigation-based Application в xcode 4


Автор: fris 15.2.2012, 01:27
Приветствую. 

Возникла необходимость попробовать написать прожку для iphone. Уровень знаний в данной области нулевой. 

Mac mini, xcode 4.2.1.

Нужно для начала на эмуляторе сварганить rss читалку.
В инете в примерах по подобной задаче написано что нужно создать проект Navigation-based Application. Но почему то при выборе шаблонов Navigation-based Application нету.
Вопрос : какой другой взять шаблон наиболее приближенный к указаному? Или же где можно настроить эти шаблоны, чтоб появился нужный?

Заранее спасибо. smile




Автор: Bitter 15.2.2012, 11:56
Вы можете создать проект на основе шаблона SingleViewApplication. После создания заготовки, в классе AppDelegate в методе application:didFinishLaunchingWithOptions: Вы увидите следующий код:
Код

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;


Как можно заметить тут создается вью контроллер в строке self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
А потом этот контроллер помещается в окно self.window.rootViewController = self.viewController;

Немного изменив это Вы добьетесь нужного результата. Нужно всего лишь создать UINavigationController и положить в него тот вью контроллер. А уже навигэйшн положить в окно.
Код

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    [self.viewController setTitle:@"MainMenu"];

    UINavigationController * ncMain = [[UINavigationController alloc] initWithRootViewController:self.viewController];

    self.window.rootViewController = ncMain;
    [ncMain release];
    [self.window makeKeyAndVisible];
    return YES;


Автор: fris 15.2.2012, 17:31
Создал шаблон SingleViewApplication.

Там был метод тока с одной строчкой:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    return YES;

}

Заменил return YES; указанным кодом. Выдало кучу ошибок... не понимало директиву autorelease, release. выдавало 'release' is unavaible: notavailable in automatic reference counting mod. ARC forbids explicit message send of 'release'

Ругалось на self.viewController . Ошибка: property 'viewConroller' not found on object of type 'AppDelegate*'

В общем просто так не получается. smile Похоже сгенерило автоматом код отличный от того что у вас... не хватает ему каких то определний или деклараций где-то.

Автор: fris 15.2.2012, 18:37
Это исправил. Я там при выборе проекта выбрал use storyboard. теперь я все галки там поснимал. Бум рыть дальше... smile

Автор: Bitter 16.2.2012, 00:53
Вы выбрали Use automatic reference counter. По этому оно и ругалось на релизы. Одна строчка там была действительно потому что был выбран стрибоард. Это такая штука которая во многом упрощает жизнь. Кстати с помощью нее тоже можно сделать Navigation Based без написания какого либо кода вообще:

1. Создаем Single View Based Application с выбранным сторибоардом:
user posted image

2. Открываем созданный сторибоард в проекте
user posted image

3. Видим наш основной контроллер. Перетаскиваем на поле NavigationController
user posted image

user posted image

4. Он перетянется вместе со своим ViewController, который мы благополучно удаляем. Он нам не нужен потому что у нас есть свой. Затем правой кнопкой нажимаете на Навигэйшн контроллере и тянете на свой кнтроллер. Отпускаете и выбираете в меню RelationShip - rootViewController
user posted image

5. Вы увидите длинную стрелку, переместите контроллер на правую строну для удобства 
user posted image

6. и назначьте NavigationController Is Inital View Controller
user posted image

7. Последнее - задайте заголовок вашему контролеру (для этого надо кликнуть по NavigationBar у контроллера) и запускайте.
user posted image

Вы сделали то что нужно и не написали ни строчки smile

Автор: fris 16.2.2012, 16:17
в этом примере http://lookapp.ru/2009/05/15/iphone-sdk-tutorials4/ после создания навигейшен бейсед начинают править RootViewController.h в котором RootViewController наследуются от UITableViewController.
в моем случае  это ViewController.h ,    где ViewController наследуется от UIViewController. мне  теперь нужно на форму поместить тэйбл вью контролер? и его связывать с навигейшен контролером? и нужно ViewController наследовать от UITableViewController и брать код что в том примере?

Автор: fris 16.2.2012, 16:38
У меня нету тех методов которые правятся в файлике RootViewController.m Это какие то произвольные методы или они обязательны в реализации , где взять те котрые мне нужны, т.е. у меня сгенерился ViewController.m для ViewController.h. А мне нужно его переделать под UITableViewController? 

Нужно ли что-то менять в файликах appdelegate.h и appdelegate.m в связи с этим?

Автор: Bitter 16.2.2012, 16:58
Вам нужно читать книги и задавать разные вопросы в разных темах, а не выливать поток своего непонимания в одной теме. Если вы базовых вещей не понимаете, сначала разберитесь с тем с чем имеете дело, а потом пишите программу. Если вы не понимаете как работает таблица и контроллеры то не надейтесь что напишете хоть что-то.

Автор: fris 16.2.2012, 17:28
Да, так и надо. сори, что морочу голову. Просто пока плаваю  smile 

Но вроде думал правильно , нужно тэйбл контролер подключать в проект

нашел различия в шаблонах между xcode 4.2.1 и 4.1, похоже мне нужно брать проект master detail application там навигейшен контролер уже связан с тэйбл контролером.

Автор: Bitter 16.2.2012, 20:24
Нет, не морочьтесь с шаблонами, все можно сделать с простого шаблона Simple View.
Опишите что Вам конкретно нужно. Поставить TableView в ваш вью контроллер это пара пустяков, далее связать TableView с контроллером (delegate и dataSource) и пользоваться

Автор: fris 23.2.2012, 00:26
Есть такой вопрос. Взял проект master detail application. Он мне создал два окна , на одном табличка, другое - детально - на форме только label. В табличку я загружаю rss. хочу когда кликнул на ячейку и перейдя на детально вывести в label.text значение кликнотого title из rss. Как я понял вызов controllerdetail происходит в методе:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

<код сгенерированный шаблоном>
}

В этом методе я создал NSDictionary* item, куда помещяю title и link текущей ячейки rss ридера. 

Как мне передать в controllerdetail этот самый item? 

В controllerdetail в нужном методе я присвою label.text = title + "[" + link + "]"


Автор: Bitter 23.2.2012, 12:12
Один из вариантов объявить property у вашего controllerDetail, например так

Код

.h
...
@property (nonatomic, retain) NSDictionary * dctItem;
...

.m
...
@synthesize dctItem;
 

а потом в методе didSelect... присвоить этому проперти ваш item
Код

...
[controllerdetail setDctItem:item];
...


Чтобы выполнить что нибудь в этот момент, переопределите setter как нибудь так:
Код

- (void) setDctItem:(NSDictionary *) _dctItem {
   [_dctItem retain];
   [dctItem release];
   dctItem = _dctItem;

   // TO DO something
}

Автор: fris 23.2.2012, 12:25
Да, спасибо. Я уже додумался до "Один из вариантов объявить property у вашего controllerDetail, например так". Вчера вечером делал, но с ошибками.
В общем прием и механика реализации как в finforms dotnet. smile

В разработке используется MVC. Пока еще не четко усвоил ее. Нодо поискать где совсем разжевано было с примером. И попрактиковаться. smile

Читаю книги, пробую чето делать... smile

Автор: fris 4.4.2012, 20:04
Добрый день. Вопрос такой. Что отвечает за прокрутку UI элемента, т.е. когда пальцев проводишь вниз по экрану и контрол прокручивается. Я поместил на view обычный label и сделал его размеры больше размеров видимого экрана. и получается что вижу тока часть текста котрый вывожу в этот элемент, и пальцем не прокручивается.  smile 

Автор: fris 20.4.2012, 17:42
Использовать те элементы котрые поддерживают Scroll. WebView, ScrollView...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)