Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 与自定义委托有问题_Ios_Objective C - Fatal编程技术网

Ios 与自定义委托有问题

Ios 与自定义委托有问题,ios,objective-c,Ios,Objective C,我试图实现一个简单的委托,但似乎遇到了一些问题。预期结果是用户按下UIView中的按钮,该按钮通过Outlet链接到UIViewController。我还使用UISearchBarDelegate,它工作得很好。我只是在调用自定义委托方法时遇到问题 MainViewController.h: #import <UIKit/UIKit.h> #import "CategoryFilterView.h" @interface MainViewController : UIViewCon

我试图实现一个简单的委托,但似乎遇到了一些问题。预期结果是用户按下UIView中的按钮,该按钮通过Outlet链接到UIViewController。我还使用UISearchBarDelegate,它工作得很好。我只是在调用自定义委托方法时遇到问题

MainViewController.h:

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