Как я могу использовать один и тот же кончик в контроллерах с несколькими представлениями? - PullRequest
1 голос
/ 08 января 2010

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

Я создаю базовое приложение на основе шаблона служебного приложения (с MainViewController и FlipsideViewController). Примечание: я все еще не понимаю назначение MainView и FlipsideView в этой схеме, поэтому, если кто-то может объяснить это, это не будет слишком ужасно: D

В любом случае, в нижней части обоих этих видов я хочу иметь панель инструментов. Было достаточно легко добавить это к данному представлению с помощью IB, но я хочу, чтобы панель инструментов имела свой собственный контроллер и модель, потому что я хочу, чтобы ее состояние было согласованным для двух представлений. Соответственно, я хотел бы загрузить это представление из пера, но кажется, что я делаю что-то не так. Я следовал этому совету: NSViewController и несколько подпредставлений с Nib , но, очевидно, его не хватало, чтобы было лучше понять.

Я сделал следующие вещи: Я создал ToolBarViewController, который в основном пуст, но является владельцем файла ToolBar.xib. Внутри ToolBar.xib у меня есть представление с рамкой размером с панель инструментов и внутри этой панели инструментов. В MainView.xib у меня есть элемент вида того же размера, который подключен к toolBarView, найденному в коде ниже ...

В MainViewController.h:

#import "ToolBarViewController.h"

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate, MKMapViewDelegate> {
 ...
 ToolBarViewController *toolBarViewController;
 IBOutlet UIView *toolBarView;
}

...
@property(nonatomic, retain) ToolBarViewController *toolBarViewController;
@property(nonatomic, retain) IBOutlet UIView *toolBarView;

В MainViewController.m:

@synthesize toolBarViewController;
@synthesize toolBarView;

- (void)loadView
{
    [super loadView];
    toolBarViewController = [[ToolBarViewController alloc] initWithNibName:@"ToolBar" bundle:nil];
    [[toolBarViewController view] setFrame:[toolBarView frame]];
    [[self view] replaceSubview:toolBarView with:[toolBarViewController view]];
}

При сборке и запуске я получаю предупреждение для последней строки выше, что «UIView» может не отвечать на «replaceSubview: with», и при его запуске выдается следующее исключение: *** - [MainView replaceSubview: with:]: нераспознанный селектор отправлен в экземпляр 0x450c540

Может кто-нибудь объяснить, что я делаю не так? Спасибо! А

Ответы [ 2 ]

0 голосов
/ 08 января 2010

Нет такого метода, как [UIView replaceSubview: with:]. Это метод NSView. Вы должны были получить предупреждение об этом при компиляции.

Чтобы сделать то же самое, вам нужно использовать [[self view] insertSubview:aboveSubview:], а затем [toolbarView removeFromSuperview].

Тем не менее, я не уверен, что именно так вы хотите связываться с панелью инструментов. Я бы, наверное, попробовал что-то более похожее на:

self.toolbarItems = [toolbarViewController toolbarItems];
0 голосов
/ 08 января 2010

Это потому, что в UIView нет такого replaceSubview: with: (хотя есть такой метод для NSView на Mac).

Помните, что предупреждения Objective-C обычно являются ошибками;) В общем, я склоненникогда не оставляй их без лечения, а я даже превращаю их в ошибки: http://akosma.com/2009/07/16/objective-c-compiler-warnings/

...