Представление Modalviewcontroller для Info Button при программном нажатии на UIToolbar - PullRequest
1 голос
/ 06 января 2012

Я хочу, чтобы в главном окне отображалось созданное представление modalViewController при нажатии информационной кнопки.Но когда я нажимаю кнопку Info в главном окне, ничего не происходит.

В файле mainviewcontroller.h у меня есть следующий код:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface imageviewViewController : UIViewController{
AVAudioPlayer *audioPlayer;
}

@property (nonatomic, retain) UIToolbar *toolbar;
@property (nonatomic, assign) UIBarButtonSystemItem currentSystemItem;
@property (nonatomic, retain) AVAudioPlayer *audioPlayer;

@end

В файле mainviewcontroller.m есть следующий код:

#import "imageviewViewController.h"
#import "Infoviewcontroller.h"


@implementation imageviewViewController

@synthesize toolbar;
@synthesize currentSystemItem;
@synthesize audioPlayer;

UIBarButtonItem *infoItem = [[UIBarButtonItem alloc] 
                          initWithTitle:@"Info" 
                          style:UIBarButtonItemStyleBordered 
                          target:nil 
                          action:@selector(Infobuttonpressed)]; 

  // flex item used to put space in between buttons

    UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] 
                             initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                             target:nil
                             action:nil];

    //Add buttons to the array

    NSArray *toolbarItems = [NSArray arrayWithObjects: settingsButton, flexItem, systemItem, flexItem, systemItem1,flexItem, systemItem2, flexItem, systemItem3, flexItem, infoItem, nil];

     [toolbar setItems:toolbarItems];

    [settingsButton release];
    [systemItem  release];
    [systemItem1 release];
    [systemItem2 release];
    [systemItem3 release];
    [infoItem release];
    [flexItem release];

[super viewDidLoad];  

}


- (void) Infobuttonpressed: (id) sender
{
Infoviewcontroller *myView = [[Infoviewcontroller alloc] init];
[self presentModalViewController:myView animated:YES]; // present view modally
[self.navigationController pushViewController:myView animated:YES]; // add to navigation stack
[myView release];
}

В файле Infoviewcontroller.h есть следующий код:

#import <UIKit/UIKit.h>

@interface Infoviewcontroller : UIViewController <UITextViewDelegate>

{

UITextView *textView;

}

@property (nonatomic, retain) UITextView *textView;
@property (nonatomic, assign) UINavigationBar *navBar;


@end

Тогда в файле infoviewcontroller.m есть следующий код:

#import "Infoviewcontroller.h"

@implementation Infoviewcontroller

@synthesize textView;
@synthesize navBar;



-(void)dealloc
{
[textView release];
    [navBar release];
[super dealloc];
}

 -(void)setupTextView
  {
self.textView = [[[UITextView alloc] initWithFrame:self.view.frame] autorelease];

self.textView.textColor = [UIColor redColor];

self.textView.font = [UIFont fontWithName:@"System Bold" size:13];

self.textView.delegate = self;

self.textView.backgroundColor = [UIColor whiteColor];

self.textView.textAlignment =  UITextAlignmentCenter;

self.textView.text = @"This is UITextView\nThis is UITextView\nThis is UITextView\nThis is UITextView"; 

[self.view addSubview: self.textView];    

}

- (void)viewDidLoad
{
[super viewDidLoad];

navBar = [[UINavigationBar alloc] init];
UINavigationItem *navItem = [[[UINavigationItem alloc] initWithTitle:@"ModalViewControllerTest"] autorelease];
UIBarButtonItem *done = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView:)] autorelease];
navItem.rightBarButtonItem = done;
navBar.items = [NSArray arrayWithObject:navItem];
[self.view addSubview:navBar];
}

Ответы [ 3 ]

1 голос
/ 06 января 2012
UIBarButtonItem *infoItem = [[UIBarButtonItem alloc] 
                          initWithTitle:@"Info" 
                          style:UIBarButtonItemStyleBordered 
                          target:nil 
                          action:@selector(Infobuttonpressed)]; 

Должно быть

UIBarButtonItem *infoItem = [[UIBarButtonItem alloc] 
                          initWithTitle:@"Info" 
                          style:UIBarButtonItemStyleBordered 
                          target:self
                          action:@selector(Infobuttonpressed:)]; 

Найдите разницу? Во-первых, вам не хватает цели (должно быть self, а не nil). Во-вторых, двоеточие в конце селектора является частью подписи, вы его пропустили, поэтому он не вызывал ваш метод (то есть InfoButtonPressed:(id)sender).

Кроме того, методы должны начинаться со строчной буквы.

0 голосов
/ 06 января 2012

Цель вашего infoItem установлена ​​в ноль. Вы должны установить это для экземпляра класса, в котором определено Infobuttonpressed. Я предполагаю, что это mainviewController?

Кроме того, селектор для вызова указывается как: @selector (Infobuttonpressed), а метод называется «Infobuttonpressed:», то есть с параметром. Это может привести к ошибке во время выполнения, как только вы исправите цель.

Тогда, есть некоторые особенности в том, как вы обращаетесь с вещами. Как Ник уже ответил, вам нужно выбрать, хотите ли вы представить представление модально (с presentModalViewController), или представить его как часть стека навигации (с pushViewController), вы не можете сделать оба.

Если вы представляете его как часть стека навигации, то у него уже есть панель навигации, поэтому вам не следует добавлять ее самостоятельно. Просто установите свойства self.navigationItem.

Для получения дополнительной информации см. Руководство по программированию контроллера View .

0 голосов
/ 06 января 2012

вам не нужны как pushModalViewController, так и pushViewController

Если предположить, что ваши представления уже контролируются в экземпляре UINavigationController, pushModalViewController сам по себе будет работать.

edit - удалить ссылку на pushViewController. Теперь это работает?

-(void) Infobuttonpressed: (id) sender; 
{ Infoviewcontroller *myView = [[Infoviewcontroller alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myView];
UIViewController *pushController = [[UIViewController alloc] init];
[self addSubview:pushController.view];
[pushController presentModalViewController:navController animated:YES];
[myView release]; 
} 
...