以编程方式按下 UIToolbar 时显示信息按钮的 Modalviewcontroller

发布于 2024-12-25 04:43:47 字数 3654 浏览 1 评论 0原文

我希望在按下信息按钮时在主窗口上显示创建的 modalViewController 视图。但是当我按主窗口上的“信息”按钮时,什么也没有发生。

在 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];
}

I want is on main window to present the created modalViewController view when the infobutton is pressed. But when I press Info button on the main window nothing happens.

In the mainviewcontroller.h file I have following code:

#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

In the mainviewcontroller.m file have following code:

#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];
}

In the Infoviewcontroller.h file have following code:

#import <UIKit/UIKit.h>

@interface Infoviewcontroller : UIViewController <UITextViewDelegate>

{

UITextView *textView;

}

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


@end

Then in the infoviewcontroller.m file have the following code:

#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];
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

锦上情书 2025-01-01 04:43:47
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)。

顺便说一句,方法应该以小写名称开头。

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

Should be

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

Spot the difference? First, you're missing a target (should be self, not nil). Second, the colon at the end of the selector is part of the signature, you were missing it so it was not calling your method (which is InfoButtonPressed:(id)sender).

As an aside, methods should start with a lower case name.

忆依然 2025-01-01 04:43:47

您不需要同时使用pushModalViewController和pushViewController

假设您的视图已经在UINavigationController的实例中控制pushModalViewController本身就可以工作。

编辑-删除对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]; 
} 

you dont need both pushModalViewController and pushViewController

Assuming your views are already controlled within an instance of a UINavigationController pushModalViewController on its own will work.

edit - remove the reference to pushViewController. Does it now work?

-(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]; 
} 
你是我的挚爱i 2025-01-01 04:43:47

您的 infoItem 的目标设置为 nil。您应该将其设置为定义 Infobuttonpressed 的类的实例。我认为那是 mainviewController?

另外,要调用的选择器指定为:@selector(Infobuttonpressed),而该方法称为“Infobuttonpressed:”,即带有参数。一旦修复目标,这可能会导致运行时错误。

然后,你处理事情的方式有一些特殊性。正如 Nik 已经回答的那样,您需要选择是要以模态方式呈现视图(使用presentModalViewController),还是将其呈现为导航堆栈的一部分(使用pushViewController),您不能同时执行这两种操作。

如果您将其作为导航堆栈的一部分呈现,那么它已经有一个导航栏,因此您不应该自己添加一个。只需设置 self.navigationItem 的属性即可。

看看 查看控制器编程指南了解更多信息。

The target of your infoItem is set to nil. You should set this to an instance of the class where the Infobuttonpressed is defined. I assume that is the mainviewController?

Also, the selector to call is specified as: @selector(Infobuttonpressed), while the method is called "Infobuttonpressed:", that is, with a parameter. That will likely result in a runtime error once you fix the target.

Then, there are some peculiarities in the way you handle things. As Nik already answered, you need to choose whether you want to present the view modally (with presentModalViewController), or present it as part of the navigation stack (with pushViewController), you cannot do both.

If you present it as part of the navitation stack, then it already has a navigation bar, and so you should not add one yourself. Just set the properties of the self.navigationItem.

Have a look at the View Controller Programming Guide for more info.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文