MFMessageComposeVIewController忽略它的委托,而不是它本身(MFMessageComposeVIewController is dismissing its delegate instead of itself)
我有一个符合MFMessageComposeViewControllerDelegate协议的VC。
我用下面的代码成功地展示了这个视图控制器:
- (IBAction)textAction:(id)sender { if(![MFMessageComposeViewController canSendText]) { UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Your device doesn't support SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [warningAlert show]; return; } NSString *numberToCallOrText = self.phoneNumber; NSString *message = @"Test message"; NSArray *recipients = [NSArray arrayWithObject:numberToCallOrText]; MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init]; messageController.messageComposeDelegate = self; [messageController setRecipients:recipients]; [messageController setBody:message]; // Present message view controller on screen [self.view endEditing:YES]; [self presentViewController:messageController animated:YES completion:nil]; }
另外,我正在处理完成结果,如下所示:
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult) result { switch (result) { case MessageComposeResultCancelled: NSLog(@"Canceled"); break; case MessageComposeResultFailed: { NSLog(@"Failed"); UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to send SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [warningAlert show]; break; } case MessageComposeResultSent: NSLog(@"sent"); [self.navigationController popViewControllerAnimated:YES]; break; default: break; } [controller.view endEditing:YES]; [self.navigationController popViewControllerAnimated:YES]; // [self dismissViewControllerAnimated:YES completion:nil]; // [controller popToViewController:self animated:YES]; // [controller dismissViewControllerAnimated:YES completion:nil]; }
三条注释掉的线是我尝试过的替代品。 发生的事情是MFMessageComposeViewController保留在屏幕上(虽然键盘被解除),但是委托从堆栈中弹出。 因此,当我再次点击取消时,我得到一个空引用错误。
这很奇怪,因为这个相同的实现在我的代码中的其他地方工作。 唯一的区别是我已经设置了要初始化的主体。
任何想法为什么错误的VC会在这里突然出现?
谢谢。
编辑 - 破坏的实现是在UITableViewController而不是UIView控制器...可能是什么导致了问题?
I have a VC that conforms to the MFMessageComposeViewControllerDelegate protocol.
I am successfully presenting this view controller with the following code:
- (IBAction)textAction:(id)sender { if(![MFMessageComposeViewController canSendText]) { UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Your device doesn't support SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [warningAlert show]; return; } NSString *numberToCallOrText = self.phoneNumber; NSString *message = @"Test message"; NSArray *recipients = [NSArray arrayWithObject:numberToCallOrText]; MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init]; messageController.messageComposeDelegate = self; [messageController setRecipients:recipients]; [messageController setBody:message]; // Present message view controller on screen [self.view endEditing:YES]; [self presentViewController:messageController animated:YES completion:nil]; }
Additionally, I am handling the finish result like so:
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult) result { switch (result) { case MessageComposeResultCancelled: NSLog(@"Canceled"); break; case MessageComposeResultFailed: { NSLog(@"Failed"); UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to send SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [warningAlert show]; break; } case MessageComposeResultSent: NSLog(@"sent"); [self.navigationController popViewControllerAnimated:YES]; break; default: break; } [controller.view endEditing:YES]; [self.navigationController popViewControllerAnimated:YES]; // [self dismissViewControllerAnimated:YES completion:nil]; // [controller popToViewController:self animated:YES]; // [controller dismissViewControllerAnimated:YES completion:nil]; }
The three commented out lines are alternatives that I have tried. What's happening is that the MFMessageComposeViewController is remaining on the screen (though the keyboard is dismissed), but the delegate is being popped from the stack. Therefore, when I hit cancel again, I get a null reference error.
It's odd, because this same implementation works elsewhere in my code. The only difference is that I've set the body to be initialized.
Any ideas why the wrong VC is getting popped here?
Thanks.
Edit - The broken implementation is on a UITableViewController rather than UIView Controller... could that be what is causing the problem?
原文:https://stackoverflow.com/questions/40389457
满意答案
我一开始努力让搜索字段在MVC风格的应用程序中工作。
我能够在你的sencha小提琴应用程序中使搜索字段工作。
在你的控制器中我做到了
Ext.define('Sencha.controller.Main', { extend: 'Ext.app.Controller', config: { refs: { main: 'mainpanel' }, control: { '#list': { disclose: 'showDetail' }, '#view':{ activate:function(){ Ext.getCmp('list').add({ xtype:'toolbar', docked:'top', items:[{ xtype: 'searchfield', itemId:'contact_search', placeHolder: 'Search....', listeners: { scope: this, clearicontap: this.onSearchClearIconTap, keyup: this.onSearchKeyUp} }] }) } } } }, showDetail: function(list, record) { this.getMain().push({ xtype: 'recipedetail', title: record.fullName(), data: record.data }) }, onSearchKeyUp: function(field) { //get the store and the value of the field var value = field.getValue(), store = Ext.getCmp('list').getStore(); //first clear any current filters on thes tore store.clearFilter(); //check if a value is set first, as if it isnt we dont have to do anything if (value) { //the user could have entered spaces, so we must split them so we can loop through them all var searches = value.split(' '), regexps = [], i; //loop them all for (i = 0; i < searches.length; i++) { //if it is nothing, continue if (!searches[i]) continue; //if found, create a new regular expression which is case insenstive regexps.push(new RegExp(searches[i], 'i')); } //now filter the store by passing a method //the passed method will be called for each record in the store store.filter(function(record) { var matched = []; //loop through each of the regular expressions for (i = 0; i < regexps.length; i++) { var search = regexps[i], didMatch = record.get('title').match(search); //if it matched the first or last name, push it into the matches array matched.push(didMatch); } //if nothing was found, return false (dont so in the store) if (regexps.length > 1 && matched.indexOf(false) != -1) { return false; } else { //else true true (show in the store) return matched[0]; } }); } }, /** * Called when the user taps on the clear icon in the search field. * It simply removes the filter form the store */ onSearchClearIconTap: function() { //call the clearFilter method on the store instance this.getStore().clearFilter(); } });
然后在app.js中我向视口添加了一个ID
launch: function() { Ext.Viewport.add({ id:'view', xtype: 'mainpanel' }); }
我还在RecieptList.js中添加了一个ID
xtype: 'recipelist', requires: ['Sencha.store.Recipes'], id:'list', config: {
可能不是最传统的解决方案,但它的工作原理。 很容易看出它们如何一起工作,希望有所帮助。
I struggled with getting the search field to work in an MVC style app at first.
I was able to make a search field work in your sencha fiddle app like this.
In your controller I did
Ext.define('Sencha.controller.Main', { extend: 'Ext.app.Controller', config: { refs: { main: 'mainpanel' }, control: { '#list': { disclose: 'showDetail' }, '#view':{ activate:function(){ Ext.getCmp('list').add({ xtype:'toolbar', docked:'top', items:[{ xtype: 'searchfield', itemId:'contact_search', placeHolder: 'Search....', listeners: { scope: this, clearicontap: this.onSearchClearIconTap, keyup: this.onSearchKeyUp} }] }) } } } }, showDetail: function(list, record) { this.getMain().push({ xtype: 'recipedetail', title: record.fullName(), data: record.data }) }, onSearchKeyUp: function(field) { //get the store and the value of the field var value = field.getValue(), store = Ext.getCmp('list').getStore(); //first clear any current filters on thes tore store.clearFilter(); //check if a value is set first, as if it isnt we dont have to do anything if (value) { //the user could have entered spaces, so we must split them so we can loop through them all var searches = value.split(' '), regexps = [], i; //loop them all for (i = 0; i < searches.length; i++) { //if it is nothing, continue if (!searches[i]) continue; //if found, create a new regular expression which is case insenstive regexps.push(new RegExp(searches[i], 'i')); } //now filter the store by passing a method //the passed method will be called for each record in the store store.filter(function(record) { var matched = []; //loop through each of the regular expressions for (i = 0; i < regexps.length; i++) { var search = regexps[i], didMatch = record.get('title').match(search); //if it matched the first or last name, push it into the matches array matched.push(didMatch); } //if nothing was found, return false (dont so in the store) if (regexps.length > 1 && matched.indexOf(false) != -1) { return false; } else { //else true true (show in the store) return matched[0]; } }); } }, /** * Called when the user taps on the clear icon in the search field. * It simply removes the filter form the store */ onSearchClearIconTap: function() { //call the clearFilter method on the store instance this.getStore().clearFilter(); } });
And then in the app.js I added an ID to the viewport
launch: function() { Ext.Viewport.add({ id:'view', xtype: 'mainpanel' }); }
I also added an ID to the RecieptList.js
xtype: 'recipelist', requires: ['Sencha.store.Recipes'], id:'list', config: {
Might not be the most conventional solution but it works. It is pretty easy to see how it all works together, hope that helps.
相关问答
更多Sencha Touch 2.3:将数据从列表视图推送到详细视图(Sencha Touch 2.3: Pushing data from list view to detail view)
sencha touch 2:列出具有模型关联的人口(sencha touch 2: list population with associations in model)
Sencha触摸列表与模型和商店(Sencha Touch List with Model and Store)
将onLoad侦听器添加到Sencha Touch List(Add onLoad Listener to Sencha Touch List)
Sencha Touch,setRecord()不起作用。(Sencha Touch, setRecord() not working. Fields are blank.)
Sencha touch,选择主对象项目时显示详细信息(Sencha touch, Show details when selecting master objects' item)
搜索字段在sencha touch中(Search fields In sencha touch)
如何使用详细信息卡在列表中添加搜索?(How to add search in list with detail cards? (Sencha Touch 2))
Sencha Touch读取XML数据(Sencha Touch Reading XML data)
sencha touch将变量添加到模板/ List / etc.(sencha touch add variables to templates/List/ etc)
相关文章
更多忽略特殊文件-git入门教程
HttpClient 获取HTTPS证书和忽略证书错误
微信收费事件背后被广泛忽略的技术细节
微信收费事件背后被广泛忽略的技术细节
SolrCloud分布式检索时忽略宕机的Shard
实现友盟分享
solr dataimport 数据导入源码分析(五)
友盟分享到朋友圈时, 点击链接跳转到友盟自家页面的处理
Storm-源码分析- bolt (backtype.storm.task)
设计模式之代理模式(静态代理和动态代理)
最新问答
更多获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
如何通过引用返回对象?(How is returning an object by reference possible?)
矩阵如何存储在内存中?(How are matrices stored in memory?)
每个请求的Java新会话?(Java New Session For Each Request?)
css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)
无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)
xcode语法颜色编码解释?(xcode syntax color coding explained?)
在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)
从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)
从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))
Copyright ©2023 peixunduo.com All Rights Reserved.粤ICP备14003112号
本站部分内容来源于互联网,仅供学习和参考使用,请莫用于商业用途。如有侵犯你的版权,请联系我们(neng862121861#163.com),本站将尽快处理。谢谢合作!