xcode objective-c ibaction添加

新手一枚,添加IBACTION的时候,无论是UIbutton还是UIbaritem,在type里面选了类型,但是添加之后仍然为id,不知道这是怎么回事.另外发现如果类型是... 新手一枚,添加IBACTION的时候,无论是UIbutton还是UIbaritem ,在type里面选了类型,但是添加之后仍然为id,不知道这是怎么回事.

另外发现如果类型是id的话,用它的属性,比如sender.text或sender.tilte,xcode会提示这个对象没有找到这个属性,但是如果type选uibutton或者uibaritem就可以直接用sender加属性,求解为什么
展开
 我来答
goreycn
2012-11-20 · TA获得超过840个赞
知道小有建树答主
回答量:1272
采纳率:0%
帮助的人:857万
展开全部
楼主忽略了id 的本质,
它是无类型的指针, 可以想像成C语言里的 void *

既然是无类型的, 那么在需要的地方, 只要在其变量前面加一个类型转换就好了.

比如一个UIButton的action事件方法名为:
- (void)actionMe:(id)sender
那么在方法体里,为了得到相关的UIButton的操作,
你只要
UIButton* btn = (UIButton*)sender;
这样就可以对这个参数进行操作了.

第二个问题, 就是在构建action方法时, 那个sender参数本来是可有可无的.
比如你可以定义一个这样的响应方法
- (void)actionGo;

同时对于那个后面的sender参数,你是可以指定参数类型的, 就像你上面例举的一些.
但是如果用XCode的工具自动生成的话, 它可能会直接用id去表示 ,
原因就是上面讲的, 所有的UIKit对象指针都可以用id 来表示 ,
反过来说 , 就是id 可以通过类型转换来表达你本来的对象类型.

gl
追问
你回答我非常满意,但是我就是好奇为什么我xcode里面,拖出来,自己手选了type,但最后生成的还是id类,我看视频中老师操作的没问题啊。
追答
这个问题, 可以归结为xcode本身的问题吧.
毕竟, xcode经常crash
lization
2012-11-20 · TA获得超过267个赞
知道小有建树答主
回答量:213
采纳率:0%
帮助的人:88.8万
展开全部
id你可以理解为NSObject的指针,也就是所有类的父类的指针,所以他可以指向任何对象。
.text,.tilte,这些都是UIbutton和UIbaritem才有的属性,用id类型的指针去调当然会有警告,因为id类型的对象没有这个属性(虽然会有警告,但是如果指向的确实是一个buton的话,运行也不会出错)。

最简单的解决办法就是强制转换:
- (void)buttonClick:(id)sender{
UIButton *button = (UIButton *)sender;

.......

}

或者直接写成
- (void)buttonClick:(UIButton *)sender{

......

}
追问
你的回答也很好,但是人家先回答的。就给他了。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pxfokko
2012-11-20 · 超过55用户采纳过TA的回答
知道小有建树答主
回答量:161
采纳率:0%
帮助的人:110万
展开全部
type是button的样式而已

在xib中有没有关联所有的button或baritem
没有关联上肯定找不到该对象
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式