Tag: 委托

如何解决/处理委派EXC_BAD_ACCESS错误? Obj C

我正在编写一个我想要打包和销售的库(Obj-C for iPhone),所以我显然需要在出售之前找出任何devise扭结。 我也利用这个库来帮助我开发另一个应用程序。 我的图书馆是build立在任务授权之上的。 我所拥有的主要function是启动一个(可能)长时间运行的过程,当完成时,我会在类的委托中调用委托协议方法。 另外一个复杂的因素是,我会经常安排这个任务每隔30秒左右发射一次。 通常,我使用[self performSelector:@selector(someMethod 🙂 withObject:nil afterDelay:30]来执行此操作,而不是使用NSTimer。 然后,当委托方法成功返回时,我处理返回的数据并触发另一个30秒的方法。 这给我30秒间BETWEEN方法调用,而不是从一个呼叫开始到下一个30秒。 (这主要是为了防止电话超过30秒,这不应该发生。) 我遇到的错误是,有时,委托callback方法失败,出现EXC_BAD_ACCESS错误。 根据我的调查,自从长期运行的过程开始以来,我的class级代表似乎已经消失了(被释放/处理)。 因此,当它调用[[self Delegate] doSomeDelegateMethod]时,它正在访问一个已发布的对象。 我试着首先检查[[自我委托] respondsToSelector:@selector(doSomeDelegateMethod)],但即使该访问显然也会引发EXC_BAD_ACCESS。 似乎还没有检查[self Delegate] ==零是正确的路要走。 一种方法,我想我已经解决了这个问题,在这个特定的情况下,是实例化我的对象的视图控制器正在消失(因此在垃圾转储的途中),我调用[NSObject cancelPreviousPerformRequestsWithTarget:self]。 这显然解决了这个问题。 (这个“修复”是否也表明我的对象“知道”来电的呼叫,并保持自己的记忆,直到它能够成功,拼命地开除最后的镜头?) 这似乎把一个创可贴的伤口。 是的,这似乎阻止我的应用程序打破这一次,但我的直觉告诉我,这是一个糟糕的解决scheme。 我也考虑过在我的viewWillDisappear:animated:方法中将自定义对象设置为零,这可能是正确的编码模式,但客户在处理我的对象时不得不如此精确。 然而,真正困扰我的是,作为一个图书馆开发者,我还没有find一种方法来“框入”我的代码,以便它不会为用户抛出exception,如果他们不做正确的事情。 基本上,我想要一个方法来得到我的对象: 获取请求。 去寻找答案。 find答案。 尝试返回答案。 意识到在另一端没有任何东西。 放弃自己而死。 (好吧,“自己死”可能不会发生,但你明白了。) 一个有趣的一面: 我有防止这种types的错误发生的主要原因是这样的: 我做了以下步骤: 构build我的库的.h / .m文件。 生成我的库的.a输出文件。 将我的图书馆的.a / .h文件导入到另一个项目中。 有上面描述的错误。 必须仔细阅读.m文件中应该隐藏在.a文件中的代码。 我在这里错过了什么? 如果它为客户端引发错误,我真的冒着暴露我的整个源代码的风险吗? […]

用于解决inheritance委托的不兼容属性types的语法

我inheritance的一些代码有一个恼人的警告。 它声明一个协议,然后用它来指定委托 @protocol MyTextFieldDelegate; @interface MyTextField: UITextField @property (nonatomic, assign) id<MyTextFieldDelegate> delegate; @end @protocol MyTextFieldDelegate <UITextFieldDelegate> @optional – (void)myTextFieldSomethingHappened:(MyTextField *)textField; @end 使用myTextField类实现MyTextFieldDelegate并用下面的代码调用它: if ([delegate respondsToSelector:@selector(myTextFieldSomethingHappened:)]) { [delegate myTextFieldSomethingHappened:self]; } 这个工作,但创build(合法)的警告: 警告:属性types“id”与从“UITextField”inheritance的types“id”不兼容 以下是我提出的解决scheme: 删除该属性。 这工作,但我得到警告'-myTextFieldSomethingHappened:'没有在协议(S) 完全放弃协议。 没有警告,但是如果忘记在委托中实现协议,也会丢失语义警告。 有没有办法来定义委托属性,使编译器是快乐的?

如何解决“没有已知的select器实例方法performSelector:withObject:afterDelay:'”当迁移到ARC?

ARC迁移工具在开始迁移之前拒绝接受此代码: [self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 委托人被强制使用协议来实现这个方法,它应该可以正常工作: @protocol OverlayDelegate <NSObject> – (void)overlayDismissed:(Overlay*)overlay; @end @interface Overlay : UIImageView { id<OverlayDelegate> delegate; } @property (nonatomic, assign) id<OverlayDelegate> delegate; ARC有什么问题? 为什么它告诉我有没有已知的实例方法select器performSelector:withObject:afterDelay:'?

具有自定义委托或数据源的视图控制器的状态保存

我正在尝试使用iOS 6+(我的应用程序是7.0+)State Preservation来保存从另一个View Controller以模态方式呈现的视图。 因此它具有典型的模式视图控制器解散模式: TNTLoginViewController.h包含 @protocol TNTLoginViewControllerDelegate <NSObject> – (void)TNTLoginViewControllerDismiss:(TNTLoginViewController *)controller; @end @interface TNTLoginViewControllerDelegate : NSObject @interface TNTLoginViewController : UIViewController @property (weak, nonatomic) IBOutlet id <TNTLoginViewControllerDelegate> delegate; – (IBAction)getStarted:(id)sender; @end getStarted:实现 – (IBAction)getStarted:(id)sender { // Perform login … // Dismiss me [self.delegate TNTLoginViewControllerDismiss:self]; } TNTLoginViewControllerDismiss:委托的方法,它提供了模态 – (void)TNTLoginViewControllerDismiss:(TNTLoginViewController *)controller { [self dismissViewControllerAnimated:YES completion:nil]; } 这一切都像一个魅力! […]

多个UIActionSheets在同一个委托

我正在写益智游戏。 当用户按下检查button,我看他们input的解决scheme是否正确。 根据结果​​,我为他们提供了两个行动表之一。 现在我只是有一些NSLog语句来确保事情得到调用,但只有其中一个工作表似乎正常工作。 当我单击showErrorsActionSheet中的button时,没有任何东西被调用 。 操作表从屏幕上消失,但日志从不打印。 我怀疑它有两个行为表单声明到同一个委托(自我) – (void) checkSolution { //code determines the value of the BOOL allCorrect if (allCorrect) { //IF ALL OF THE LETTERS WERE CORRECT //display UIAlertView; NSLog(@"allCorrect"); UIActionSheet *levelCompleteActionSheet = [[UIActionSheet alloc] initWithTitle:@"Congratulations! You Have Finished the Level!" delegate:self cancelButtonTitle:@"Review my work" destructiveButtonTitle:@"Choose next puzzle" otherButtonTitles:nil, nil]; [levelCompleteActionSheet showInView:self.view]; […]

awakeFromNib的好处?

我一直在学习coredata,通过使用“use coredata”选中基于xcode导航控制器模板的很多简单的testing应用程序。 应用程序委托中的awakeFromNib方法一直是我的问题的一个来源,因为我将其他视图添加到控制器并更改加载顺序,以便RootViewController可能是第二个或第三个select。 我已经知道了awakeFromNib在做什么,我已经删除了它,所以应用程序委托不再绑定到任何特定的视图。 (所以,当我想要加载RootViewController,我将加载它作为一个常规的看法,并使用自己的viewDidLoad初始化视图的managedObjectContext)。 我的问题:在AppDelegate中使用awakeFromNIb会有性能提升或其他好处吗? 还是只是另一种方式做同样的事情,我从viewDidLoad方法做?

iOS Swift:闭包(callback)与代表,何时使用哪个?

就我个人而言,我更喜欢Swift中委托的callback,因为它非常简单易懂。 同时,有些人更喜欢委托,因为委托是其他语言(如C#)中的stream行模式。 我在网上find了一些讨论: 1.“为什么你不应该在Swift中使用代表? https://medium.cobeisfresh.com/why-you-shouldn-t-use-delegates-in-swift-7ef808a7f16b#.hqb7zrc1v 2.苹果正在把重点转移到callback模式上 https://www.reddit.com/r/swift/comments/2ces1q/closures_vs_delegates/ 3.块或代表? http://blog.stablekernel.com/blocks-or-delegates/ 在阅读这些讨论之后,我仍然对这个偏好犹豫不决。 我想知道什么时候最好使用闭包,何时使用代理更好? 和原因? 谢谢!

无法接收来自第二个视图控制器的回叫

我有两个视图控制器。 我试图将数据传递给以前的视图控制器 我在我的第二个视图控制器CEPeoplePickerNavigationController下面的代码 @class CEPeoplePickerNavigationController; @protocol CEPeoplePickerNavigationControllerDelegate <NSObject> – (void)previousViewController:(CEPeoplePickerNavigationController *)controller itemToSend:(NSString *)item; @end @interface CEPeoplePickerNavigationController : UIViewController <UITableViewDelegate,UITableViewDataSource>{ } @property (nonatomic, retain) id < CEPeoplePickerNavigationControllerDelegate> peoplePickerDelegate; @end 当用户点击完成button时,下面的代码将被执行 – (void)doneAction:(id)sender { [self.peoplePickerDelegate previousViewController:self itemToSend:@"From Previous VC"]; [self dismissViewControllerAnimated:YES completion:nil]; } 在我的第一个视图控制器中,我在头文件中有以下接口,并且我在我的第一个视图控制器中实现了先前的视图控制器方法,其中必须接收数据 @interface CallViewViewController : UIViewController<CEPeoplePickerNavigationControllerDelegate> @end 当我从第一个视图控制器移动到第二个视图控制器时,使用下面的代码。 CEPeoplePickerNavigationController *nextVc = [[CEPeoplePickerNavigationController alloc] init]; nextVc.peoplePickerDelegate […]

UITableView粘页脚/自定义工具栏实现

我正在使用UITableViewController ,我想要做的是在UIView下添加一个自定义工具栏。 我已经尝试启用navigationController (下面的代码)的工具栏,但它似乎不会正常工作。 UITextField不会调用委托,文本字段的按键不显示在文本字段中。 使用这样的工具栏不是我的第一select,我想我的自定义视图下我的UITableViewController我可以把我的项目,这就像一个UIToolbar。 (保持为UIView页脚) 码: self.navigationController.toolbarHidden = NO; // create toolbar objects UITextField *inputField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 230, 31)]; inputField.backgroundColor = [UIColor clearColor]; inputField.borderStyle = UITextBorderStyleRoundedRect; inputField.inputAccessoryView = self.navigationController.toolbar; inputField.returnKeyType = UIReturnKeyDone; inputField.delegate = self; UIButton *sendButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 30)]; sendButton.titleLabel.text = @"Send"; sendButton.backgroundColor = [UIColor […]

编译器在Swift iOS中为一个协议分配委托时出错

我有一个问题,委派一个对象是一个类的实例,在Swift中定义一个协议,如下所示: 我将代码简化为简单的例子来说明问题:这是协议类 protocol TheProtocol { func notifyDelegate() } class ClassWithProtocol: NSObject { var delegate: TheProtocol? fire() { delegate?.notifyDelegate() } } 这是符合协议的类 class ClassConformingToProtocol: NSObject, TheProtocol { var object: ClassWithProtocol? func notifyDelegate() { println("OK") } init() { object = ClassWithProtocol() object?.delegate = self // Compiler error – Cannot assign to the result of this expression object?.fire() […]