当我想访问UIView
当前的父级时,UIView
我UIView
在当前声明父级UIView
的父UIView
对象,并通过将父对象分配给当前视图的对象属性来访问它.
有没有办法摆脱这种情况并直接调用父视图的方法或属性?
我也试过(parentView *) self.view.superview
但没有帮助.
调用此对象的函数时会出错
[UIVIew unrecognized selector......
Run Code Online (Sandbox Code Playgroud) CustomView *customView = [...];
[self.view addSubview:customView];
Run Code Online (Sandbox Code Playgroud)
我需要在我的CustomView类中检测它在其他视图中添加或者我的superview更改时.
我在视图层次结构中有一个随机的子视图.获得根超级视图的最佳/最快/最聪明的方法是什么?
干杯,
道格
希望有人可以帮助我,因为我已经坚持了好几个小时.
我正在尝试制作一本图画书.我有一个视图,这是我的容器,我通过使用addsubview添加子视图.
在子视图中,我有滑动手势等,我想在父视图中触发off方法.我找出了如何触发委托,但我不能让委托触发父视图.我已经阅读了10种不同的方法,但没有工作.
我现在对超级视图的含义感到非常困惑.只是为了混淆事项,委托有一个tabcontroller,父视图是tab按钮1
我试过了
[self.view.superview method]
[self.superview method]
Run Code Online (Sandbox Code Playgroud)
在委托上我尝试了self.tabcontroller.parentviewcontroller,selectedview,super view.super
更新:子视图需要独立于父视图作为其可重用的视图.另外我没有将父视图设置为superview,因为我只是认为superview是一个带子视图的视图(请不要杀了我).那么也许我只需要将父视图设置为superview?
我有一个基于导航的应用程序,我将自定义视图放在导航视图中.
首先,我想知道如何获取"导航视图"的框架,以便我可以正确地放置我的自定义视图.
此外,我有时隐藏导航栏,并希望确保我正确获取帧信息.(不是[[UIScreen mainScreen]界限])
其次,一般来说,如何访问superview的框架以便我可以相应地放置视图?
我尝试了以下但没有成功.
-(void) loadView {
[super loadView];
UIView* myView = [[UIView alloc] initWithFrame: CGRectZero];
self.view = myView;
self.view.frame = self.view.superview.frame;
[myView release];
}
Run Code Online (Sandbox Code Playgroud)
或者在layoutSubviews中设置框架,但注意到layoutSubviews没有被调用.我猜那是因为我在这个特定视图中没有任何子视图?
谢谢
-编辑-
给定答案,我现在知道我需要将view.frame设置为superview的界限.
问题是我无法访问viewDidLoad中的superview.
我可以看到superview在viewWillAppear中正确设置,但在viewDidLoad中没有.
我发现viewDidLoad会在不同的时间被调用,例如当被pushViewController推送或访问self.view时
我有以下代码,viewDidLoad从nil == controller.view.superview调用.
if (nil == controller.view.superview) {
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.view.frame = frame;
[scrollView addSubview:controller.view];
}
Run Code Online (Sandbox Code Playgroud)
由于我无法从viewDidLoad访问superview,我无法像以前在viewDidLoad中那样布局视图.这看起来很不方便而且不必要地复杂.
有什么建议吗?
我想我正在与仿制药斗争.我想创建简单的UIView扩展,以递归方式查找函数param中传递的类的超级视图.我希望函数返回可选的包含nil的对象,或者作为提供的类的实例可见的对象.
extension UIView {
func superviewOfClass<T>(ofClass: T.Type) -> T? {
var currentView: UIView? = self
while currentView != nil {
if currentView is T {
break
} else {
currentView = currentView?.superview
}
}
return currentView as? T
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢.
无论如何我在这里找不到答案,也没有看到重复的问题.
我的代码很简单.给定3 UIView,parent,from和to,从parent中删除并添加子视图.+添加动画,但这只是doodads.
现在,问题是当我这样做时,然后得到抵消.好像它被推倒了.
我甚至添加了To.frame = ParentView.frame; 确保它有效.它没有.
我该怎么办?
+ (void) AnimateSwitchingWithParent: (UIView *) ParentView From: (UIView *) From To: (UIView* ) To
{
/*[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:ParentView cache:YES];*/
[From removeFromSuperview];
[ParentView addSubview:To];
To.frame=ParentView.frame; //If I don't do this, the subview is still off by around 20 points
NSLog(@"To.bounds: %@", NSStringFromCGRect(To.bounds));
NSLog(@"From.bounds.: %@", NSStringFromCGRect(From.bounds));
NSLog(@"ParentView.bounds: %@", NSStringFromCGRect(ParentView.bounds));
//JA_DUMP (To.bounds);
//JA_DUMP (To.bounds);
/*[UIView commitAnimations];*/
}
Run Code Online (Sandbox Code Playgroud)
我已经找到了解决方案.结果是To的框架
To.frames:{{0,0},{320,372}}
但是,如果我删除To.frame = ParentView.frame,那么框架也是如此
{{0,20},{320,460}}
我想知道为什么?20点似乎是状态栏的距离.我们在哪里可以在InterfaceBuilder中设置该框架?
我在SimulatedMetric部分中将statusbar设置为none.
我得到的UITutView属于UIButton属于这样:
-(void)buttonHandler:(UIButton *)button {
OrderCell *cell = [[button superview] superview];
NSLog(@"cell.item = %@", cell.item.text);
Run Code Online (Sandbox Code Playgroud)
在iOS 7之前它可以正常工作.但是给了我:
[UITableViewCellScrollView item]:无法识别的选择器发送到实例0x17ae2cf0
如果我在iOS 7中运行该应用程序.但如果我这样做:
-(void)buttonHandler:(UIButton *)button {
OrderCell *cell = [[[button superview] superview] superview];
NSLog(@"cell.item = %@", cell.item.text);
Run Code Online (Sandbox Code Playgroud)
然后它可以在iOS 7中运行,但不是更早???!?!
我这样做是在绕过这个问题:
OrderCell *cell;
if([[[UIDevice currentDevice] systemVersion] isEqualToString:@"7.0"])
cell = [[[button superview] superview] superview];
else
cell = [[button superview] superview];
NSLog(@"cell.item = %@", cell.item.text);
Run Code Online (Sandbox Code Playgroud)
但是WTF还在继续!?有谁知道为什么会这样?
谢谢!
我有一个从选项卡式应用程序模板创建的应用程序.(ARC,iOS 4)
问题
现在,当ModalViewCont在屏幕上,按Home键将应用程序放在后台并在获得应用程序后,关闭ModalViewCont不会带回ViewCont2的视图,而是带有底部标签栏的黑屏.没有放置应用程序背景/前景就会发生同样的事情; 如果在点击2.制表符之前点击其他选项卡.(编辑:只有在viewWillDisappear中将self.view设置为nil而不是viewDidDisappear时才会发生这种情况.)
我确定ViewCont2加载一个新视图(检查它的引用)但是视图的superview是nil所以新视图不会显示而是显示黑屏.
事情没有用
我考虑的解决方案
_
if (self.view.superview == nil)
{
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
Run Code Online (Sandbox Code Playgroud)
问题
编辑:似乎早于它应该调用viewDidLoad时(即在viewWillDisappear而不是viewDidDisappear中查看视图时),不设置superview.
我有UITableViewCell
一个UITableViewController
.在我的手机有一个按钮,当你点击带你到另一个view
用prepareforsegue
.在prepareForSegue
我这样做:
if ([[segue identifier] isEqualToString:@"MySegue"])
{
UITableViewCell *cell = (UITableViewCell*) [[sender superview] superview];
UITableView *table = (UITableView*)[[[sender superview] superview] superview];
NSIndexPath *indexPath = [table indexPathForCell:cell];
}
Run Code Online (Sandbox Code Playgroud)
好!一切都运作良好.但是现在我已经用iOS7升级了xCode,当我点击单元格中的按钮时,一个错误出现给我,我不知道如何解决它:
[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0x9e160b0
2013-09-20 16:30:44.427 MyApp[8212:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0x9e160b0'
*** First throw call stack:
(
0 CoreFoundation 0x024475e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x01a5d8b6 …
Run Code Online (Sandbox Code Playgroud) superview ×10
ios ×5
objective-c ×4
uiview ×3
iphone ×2
subview ×2
addsubview ×1
cocoa-touch ×1
frame ×1
generics ×1
ios7 ×1
parent ×1
recursion ×1
segue ×1
swift ×1
uitableview ×1
view ×1
xcode ×1