我是初学者,我有一个项目,我需要从childviewcontroller传回数据.具体来说,我的容器中有一个选择器视图,我希望能够使用它来选择一个选项(比如简化一种颜色,从十种颜色的数组中选择).然后我希望能够在我的父视图控制器中访问所选颜色并使用它做一些事情.我已经研究了这几天了,最接近我正在寻找的答案我在SO的相关问题中找到了这里它是:
"关于将值传递给containerView控制器,您可以在ChildViewController中创建一个您想要传递的值的属性.然后在您的ParentViewController中执行以下操作:
self.ChildViewController.yourProperty = yourValue
Run Code Online (Sandbox Code Playgroud)
相反可以通过4种方式完成:
您可以创建委托协议以在控制器之间传递数据.
您可以在ChildViewController中发布通知,并将父控制器添加为观察者.
你可以使用KVO.
最简单的方法是,你可以在你的parentviewController中创建一个属性,并像下面那样访问它:"
((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;
Run Code Online (Sandbox Code Playgroud)
现在,我想首先尝试第四个选项,因为委托,kvo等是我读过但尚未准备解决的选项.我需要帮助的是最后一个选项.
假设我的子视图控制器中有一个属性,我存储所选的颜色.就像是:
@interface ViewController ()
@property NSString *ChosenColorInChildVC;
@end
Run Code Online (Sandbox Code Playgroud)
然后,后来:
self.ChosenColorInChildVC = [self pickerView:myPickerView titleForRow:[myPickerView selectedRowInComponent:1] forComponent:1]];
Run Code Online (Sandbox Code Playgroud)
我将如何使用建议传递该值:
((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;
Run Code Online (Sandbox Code Playgroud)
有人可以为我进一步愚蠢吗?谢谢
objective-c parentviewcontroller childviewcontroller uicontainerview
我使用childViewController在项目中分离视图,但是发生了一些奇怪的问题,这是我的代码。
class ViewController: UIViewController {
var container = UIView()
var childVC = ChildViewController()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
addChildViewController(childVC)
childVC.didMove(toParentViewController: self)
addChildView()
setContainerFrame()
}
func setContainerFrame() {
container.frame = CGRect(x: 0, y: 100, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height - 100)
container.backgroundColor = .red
view.addSubview(container)
}
func addChildView() {
let frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
childVC.view.frame = frame
childVC.view.backgroundColor = .green
container.addSubview(childVC.view)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("childVC.view.frame: \(childVC.view.frame)")
}
} …Run Code Online (Sandbox Code Playgroud) 我已经使用autolayout几个星期了.目前,我正在使用名为FLKAutoLayout的第三方库,这使得该过程更容易.我正处于可以按照我想要的方式构建视图的地步,通常没有问题.然而,在过去4天的工作中,一旦参与了控制器,我就一直在努力进行自动布局.我对各种各样的UIViews很好......但出于某种原因,每个viewcontroller.view都是一个完全的恶魔.我只得到一个问题,让viewcontroller.view以我想要的方式调整大小,而更深层次的问题是,当使用autolayout时,子视图控制器的UIViews没有正确接收事件.子视图控制器在手动指定帧时工作得很好,但是一切都因autolayout而崩溃.
我不明白viewcontroller的UIView有什么不同之处让它与其他所有人不同......我的思绪正在沮丧地融化.ios是否在幕后或其他东西搞乱了我的viewcontroller视图?
示例图片http://i39.tinypic.com/6qeh3r.png
在图像中,红色区域属于子视图控制器.这个区域不应该超过最底部的子视图(表示三个的卡).这应该很简单,我可以通过一堆普通的UIViews使它工作得很好但是因为这是一个viewcontroller,一切都会破坏......
任何人都可以阐明我不知道的是什么.任何潜在问题的线索都非常感谢.
谢谢阅读.
更新:问题可能与模棱两可的约束有关
UIView *box = [[UIView alloc]init];
[box addSubview:imageView];
[box addSubview:nameLabel];
imageView constrainWidth:@"32" height:@"32"];
[imageView alignTop:@">=0" leading:@"0" bottom:@"<=0" trailing:@"<=0" toView:box];
[imageView alignCenterYWithView:box predicate:@"0"];
[nameLabel constrainLeadingSpaceToView:imageView predicate:@"5"];
[nameLabel alignTop:@">=0" leading:@">=0" bottom:@"<=0" trailing:@"<=0" toView:box];
[nameLabel alignCenterYWithView:box predicate:@"0"];
[self addSubview:box];
[box alignTop:@"5" leading:@"5" bottom:@"-5" trailing:@"-5" toView:self];
Run Code Online (Sandbox Code Playgroud)
上面的例子是一个模棱两可的布局,但我无法弄清楚它有什么问题......
viewcontroller ios autolayout childviewcontroller flkautolayout
有一个 ViewController1,它有一个 stackView。我创建了一个 ViewController2 实例并将它的视图作为子视图添加到 ViewController1 的 stackView 中,我想看看是否只有这样做才会调用 ViewController2 的 viewDidLoad 并且这样做了,当我将 ViewController2 的视图添加到时调用了 ViewController2 viewDidLoad ViewController1 的 stackView。例如:在 ViewController1self.stackView.addArrangedSubView(viewControler2.view)
那么为什么我们需要做 addChild(viewController2) 然后将视图添加为子视图,那些添加 childController 的典型行及其在父视图控制器层次结构中的视图
我有一个带有 4 个 vc 的导航控制器:
navigationController
FirstController
SecondController
ThirdController
FourthController
Run Code Online (Sandbox Code Playgroud)
当我在的时候,FirstController我想打印出所有没有被压入堆栈的子 vcs 的列表。
我试过:
let allVCs = self.navigationController!.childViewControllers
print(allVCs.description)
Run Code Online (Sandbox Code Playgroud)
我也试过:
let allVCs = self.navigationController!.viewControllers
print(allVCs.description)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都只得到ProjectName.FirstController. 我意识到我明白了,因为这是目前堆栈中唯一的一个。
即使它们尚未被推入堆栈,我如何找出其余的子 vcs?
//print statements I'm looking to get
ProjectName.FirstController
ProjectName.SecondController
ProjectName.ThirdController
ProjectName.FourthController
Run Code Online (Sandbox Code Playgroud) uiviewcontroller uinavigationcontroller ios childviewcontroller swift