我有一个简单的代码,其中有两个类: View Controller (这是主要的 rootViewController)和 ProductsViewController (谁是通过 PopoverController 打开的 Controller)。
正在发生的事情如下,在 内 View Controller 类我有一个负责更新 UILabel 的 setter 命令:
IBOutlet UILabel *myLabel;
@property(nonatomic,retain) NSString *saver;
- (void)viewDidLoad{
[super viewDidLoad];
myLabel.text = saver;
}
-(void)setLabel:(NSString*)value{
saver = value;
myLabel.text = value;
}
在 ProductsViewController 我的类有负责激活 setter 方法的代码:
ViewController *detailViewController = [[ViewController alloc] init];
[detailViewController setLabel:@"Changes?"];
[detailViewController release];
我相信问题在于弹出窗口打开的时间,因为我相信 UILabel 不知何故处于非事件状态,因为如果我们把
NSLog(@"Exists -> %@",myLabel);
在 setter 方法中,我们得到 (空) 有人可以帮我解决这个问题,以及如何解决这个问题?
谢谢。
编辑
我试图以这种方式使用协议(protocol):
ViewController.h
#import <UIKit/UIKit.h>
#import "ProductsViewController.h"
@interface ViewController : UIViewController <ProductsViewControllerDelegate>{
IBOutlet UILabel *myLabel;
}
-(IBAction)showPopOver:(id)sender;
- (void)productWasSelected:(NSString *)product;
@end
ViewController.m
- (void)presentProductsViewController:(ProductsViewController *)productsViewController {
productsViewController.delegate = self;
//present in popover here...
}
- (void)productWasSelected:(NSString *)product{
myLabel.text = product;
}
ProductsViewController.h
#import <UIKit/UIKit.h>
@protocol ProductsViewControllerDelegate <NSObject>
- (void)productWasSelected:(NSString *)product;
@end
@interface ProductsViewController : UIViewController
@property (nonatomic, retain) id<ProductsViewControllerDelegate> delegate;
@end
ProductsViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.delegate productWasSelected:@"Selected Product"];
NSLog(@"Called!");
}
我的 ShowPopover 方法如下:
-(IBAction)showPopOver:(id)sender{
UIButton *btn =sender;
ProductsViewController *productsView =[[ProductsViewController alloc] initWithNibName:@"ProductsViewController" bundle:nil];
popOver =[[UIPopoverController alloc] initWithContentViewController:productsView];
[popOver presentPopoverFromRect:btn.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
[productsView release];
}
最佳答案
共享同一个类的两个对象不会使它们成为同一个对象。您可能想在这里使用委托(delegate)。网上有很多教程。这是一个例子......
@protocol ProductsViewControllerDelegate <NSObject>
- (void)productWasSelected:(NSString *)product;
@end
@interface ProductsViewController : UIViewController
@property (nonatomic, weak) id<ProductsViewControllerDelegate> delegate;
@end
@implementation ProductsViewController
- (void)didSelectProduct {
[self.delegate productWasSelected:@"Selected Product"];
}
@end
@interface MainViewController : UIViewController <ProductsViewControllerDelegate>
@end
@implementation MainViewController
- (IBAction)showPopOver:(id)sender{
UIButton *btn =sender;
ProductsViewController *productsView =[[ProductsViewController alloc] initWithNibName:@"ProductsViewController" bundle:nil];
productsView.delegate = self;
popOver =[[UIPopoverController alloc] initWithContentViewController:productsView];
[popOver presentPopoverFromRect:btn.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
}
- (void)productWasSelected:(NSString *)product {
self.myLabel.text = product;
}
@end
关于ios - 如何通过 UIPopoverController 更改 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814768/