Ios 与自定义委托有问题
我试图实现一个简单的委托,但似乎遇到了一些问题。预期结果是用户按下UIView中的按钮,该按钮通过Outlet链接到UIViewController。我还使用UISearchBarDelegate,它工作得很好。我只是在调用自定义委托方法时遇到问题 MainViewController.h:Ios 与自定义委托有问题,ios,objective-c,Ios,Objective C,我试图实现一个简单的委托,但似乎遇到了一些问题。预期结果是用户按下UIView中的按钮,该按钮通过Outlet链接到UIViewController。我还使用UISearchBarDelegate,它工作得很好。我只是在调用自定义委托方法时遇到问题 MainViewController.h: #import <UIKit/UIKit.h> #import "CategoryFilterView.h" @interface MainViewController : UIViewCon
#import <UIKit/UIKit.h>
#import "CategoryFilterView.h"
@interface MainViewController : UIViewController <UISearchBarDelegate, catFilterDelegate>
@property (strong, nonatomic) IBOutlet UIView *switchViewOutlet;
// Instance Methods
- (void)searchBarLoad;
@end
CategoryFilterView.h:
#import <UIKit/UIKit.h>
@protocol catFilterDelegate <NSObject>
- (void)searchPressed;
@end
@interface CategoryFilterView : UIView
// Button Outlets
@property (strong, nonatomic) IBOutlet UIButton *byMeButtonOutlet; // Linked in .xib
@property (strong, nonatomic) IBOutlet UIButton *byFriendsButtonOutlet; // Linked in .xib
@property (strong, nonatomic) IBOutlet UIButton *searchButtonOutlet; // Linked in .xib
// Delegate
@property (assign, nonatomic) id<catFilterDelegate> delegate;
// Button Actions
- (IBAction)searchPressAction:(id)sender; // Linked with UIButton from .xib file
@end
如果需要,我可以提供更多信息。最好查看您的代表是否响应您试图调用的选择器 我建议使用以下代码调用它:
if([self.delegate respondsToSelector:@selector(searchPressed)])
{
NSLog(@"My delegate is not nil");
[self.delegate searchPressed];
}
这将告诉您是否正确设置了代理。一个很大的可能性是,您的委托为nil,但如果您在nil对象上调用选择器,它不会崩溃,但不会执行任何操作。我不确定您是如何设置的,但这对我来说是有效的。在CategoryFilterView.xib中,我使用一个按钮创建了一个视图,该按钮连接到CategoryFilterView.m文件中的iAction searchPressAction:。我删除了那个文件中的init代码,所以唯一的代码就是那个action方法。我将MainViewController设置为CategoryFilterView xib中的文件所有者。然后在MainViewController中,我使用以下代码添加子视图:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.subviewArray = [[NSBundle mainBundle] loadNibNamed:@"CategoryFilterView" owner:self options:nil];
UIView *mainView = [self.subviewArray objectAtIndex:0];
CategoryFilterView *temp = (CategoryFilterView *)mainView;
temp.delegate = self;
self.switchViewOutlet = temp;
[self.view addSubview:self.switchViewOutlet];
}
您必须向searchBarCancelButtonClicked:方法添加类似的代码才能再次获取视图
编辑后:
我不清楚您是否需要使用委托人。如果使MainViewController成为nib中视图的文件所有者,则可以直接将该视图中的任何按钮连接到MainViewController.m中的iActions,而无需使用委托。在这种情况下,您也不需要对该视图进行子类化-它可以是UIView。您是在IB中创建此视图的吗?是的,该视图是在IB中创建的。它是在独立于MainViewController的nib中创建的,或者它们都在同一个故事板中?当用户按下MainViewController中的按钮时,会调用此命令-您是指CategoryFilterView中的按钮,还是指MainViewController视图中的按钮?除上述问题外,还有一个问题。如果CategoryFilterView位于不同的nib文件中,您的switchViewOutlet在IB中连接到什么?看起来委托设置不正确。不调用NSLog。我不知道我遗漏了什么。看起来实际的问题可能是您正在点击IB中创建的项目的按钮,但您正在将委托设置为从头分配的版本。您将委托设置为错误的项目,并且不必要地创建了一个新的委托在CategoryFilterView xib中设置MainViewController是什么意思?我以前从未这样做过。@orbv,画布左侧对象列表的顶部有一个Files Owner对象。选择它,然后在右侧的Identity Inspector中,从下拉列表中选择MainViewController。谢谢!你又一次帮了我大忙。
if([self.delegate respondsToSelector:@selector(searchPressed)])
{
NSLog(@"My delegate is not nil");
[self.delegate searchPressed];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.subviewArray = [[NSBundle mainBundle] loadNibNamed:@"CategoryFilterView" owner:self options:nil];
UIView *mainView = [self.subviewArray objectAtIndex:0];
CategoryFilterView *temp = (CategoryFilterView *)mainView;
temp.delegate = self;
self.switchViewOutlet = temp;
[self.view addSubview:self.switchViewOutlet];
}