gpt4 book ai didi

ios - Objective-C 自定义集体诉讼和导出

转载 作者:行者123 更新时间:2023-11-29 13:06:23 24 4
gpt4 key购买 nike

我正在尝试创建一个 UIView 的自定义子类,如下所示:

我创建了一个包含 Picker 对象和 Toolbar 对象的 UIView 的 .xib,连接了 Outlets 和操作。

enter image description here

CustomPickerView.h

#import <UIKit/UIKit.h>

@interface CustomPickerView : UIView

@property (strong, nonatomic) IBOutlet UIDatePicker* datePicker;
@property (strong, nonatomic) IBOutlet UIBarButtonItem* doneButton;

-(IBAction) buttonDonePush:(id)sender;

@end

CustomPickerView.m

#import "CustomPickerView.h"

@implementation CustomPickerView

-(id) init
{
self=[[[NSBundle mainBundle] loadNibNamed:@"CustomPickerView" owner:self options:nil] objectAtIndex:0];
return self;
}

-(void) buttonDonePush:(id)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"CustomPickerViewDoneButtonPush" object:nil userInfo:[NSDictionary dictionaryWithObject:self.datePicker.date forKey:@"date"]];
}

@end

最后,在我的 ViewController 中,我在 viewDidLoad 方法中实例化了对象。

- (void)viewDidLoad
{
[super viewDidLoad];

self.customPickerView=[[CustomPickerView alloc] init];
self.customPickerView.datePicker.datePickerMode=UIDatePickerModeTime;

self.dateField.inputView=self.customPickerView;
}

当用户点击 self.dateField 时,我的 CustomPickerView 会很好地弹出来代替标准键盘。

问题是当用户点击我的 CustomPickerView 类中的 Done 按钮时,buttonDonePush 操作不会触发。

最佳答案

这个答案可以看作是我最近为 iOSX 提供的类似解决方案的 iOS 伴侣:

Interface-Builder: "combine" NSView-class with .xib

你的安排是这样的:

  • Mainstoryboard.storyboard
  • MyViewController.h
  • MyViewController.m

  • CustomPickerView.xib

  • CustomPickerView.h
  • CustomPickerView.m

您想将您的 customPickerView 用作 MyViewController.view 的 subview ,并希望能够从包含的上下文中访问它的控件小部件。

在您的示例中,您将在代码中创建 customPickerView,但另一个有用的场景是将其添加到 Interface Builder 中的 Storyboard。此解决方案适用于这两种情况。

在 CustomViewPicker.h 中

  • 为您的界面元素声明 IBOutlets。您已经为 datePicker 和 doneButton 完成了此操作,但您还需要一个 IBOutlet 到 UIView,它将成为这些项目的包含 View 。

    @property (strong, nonatomic) IBOutlet UIView* view;

在 CustomViewPicker.xib 中

  • 在身份检查器中将文件的所有者类设置为 CustomViewPicker。
  • 将 xib 中的顶级 View 设置为默认 UIView 类(不是 CustomViewPicker)。
  • 将您的 IBOutlets 从文件所有者:viewdatePickerdoneButton 连接到它们各自的 IB 对象
  • 将您的 IBAction 从文件所有者:buttonDonePush 连接到 doneButton IB 对象

在 CustomViewPicker.m 中:

- (id)initWithFrame:(CGRect)frame
{
//called when initialising in code
self = [super initWithFrame:frame];
if (self) {
[self initialise];
}
return self;
}

- (void)awakeFromNib
{
//called when loading from IB/Storyboard
[self initialise];
}

- (void) initialise
{
NSString* nibName = NSStringFromClass([self class]);
if ([[NSBundle mainBundle] loadNibNamed:nibName
owner:self
options:nil]) {
[self.view setFrame:[self bounds]];
[self addSubview:self.view];
}

}
-(void) buttonDonePush:(id)sender
{
//button push actions
}

如果您想在代码中初始化(正如您所做的那样),您的 MyViewController 将包含如下内容:

- (void)viewDidLoad
{
[super viewDidLoad];
CGRect frame = CGRectMake(0, 50, 320, 300);
self.customPickerView=[[CustomPickerView alloc] initWithFrame:frame];

self.customPickerView.datePicker.datePickerMode=UIDatePickerModeTime;
self.dateField.inputView=self.customPickerView;
}

[edit 删除了这条多余的行:[self.view addSubview:self.customPickerView];]

或者,您可以直接在 Storyboard中创建您的 CustomPickerView - 并设置它的框架。只需将自定义 View 添加到 MyViewController 的 Storyboard场景,并将其类更改为 CustomPickerView。将它链接到您的 self.customPickerView IBOutlet。

在这种情况下,initWithFrame 不会被调用,但是 awakeFromNib 会在 MyViewController 加载它的 CustomPickerView subview 时被调用。您的 MyViewController 的 viewDidLoad 将如下所示:

- (void)viewDidLoad
{
[super viewDidLoad];
self.customPickerView.datePicker.datePickerMode=UIDatePickerModeTime;
self.dateField.inputView=self.customPickerView;
}

如果您想从 customPickerView 中获取按钮推送操作,您可以考虑使用委托(delegate),这可能比您使用 NSNotification 更独立(但该问题超出了您的原始问题范围)。

关于ios - Objective-C 自定义集体诉讼和导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com