小编drv*_*ijk的帖子

在哪里确定UIView的大小

简介:UIViewController在初始化该视图时,应该如何知道其UIView实例的大小?

UIView的专用初始化方法是initWithFrame:(CGRect)frame方法.这将为新创建的UIView设置框架.UIViewController's如果请求了视图控制器的视图,则可以从loadView方法调用此方法.UIViewController关于子类化和视图大小的状态文档:

为视图层次结构创建视图时,应始终设置视图的自动调整大小属性.当视图控制器显示在屏幕上时,其根视图通常会调整大小以适应可用空间,可用空间可能会根据窗口的当前方向和状态栏等其他界面元素的存在而变化.

因此,UIViewController实例应该设置这些属性.到目前为止一直很好,UIViewController到目前为止还没有必要知道它的观点有多大.

UIViewController请求a 的视图并且view属性为nil时,将调用视图控制器的loadView方法.现在有一个问题,因为UIView需要初始化,但视图控制器仍然不知道视图应该是多大.你应该初始化那个视图有多大?您在代码中确定视图大小的位置?

您可以使用零rect(CGRectZero)初始化视图:

- (void)loadView {
    self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

让调用者像这样设置视图框:

UIViewController *viewController = [[MyUIViewController alloc] init];
// next two lines are normally combined, but for clarity they are not now
UIView *view = viewController.view;
view.frame = CGRectMake(0, 0, 200, 200);
Run Code Online (Sandbox Code Playgroud)

这将从视图控制器(viewController.view)请求视图,从而使用loadView方法加载其视图.此loadView方法使用a初始化视图CGRectZero.然后调用者设置其框架(view.frame = ...)

问题是视图上的frame属性设置了两次,如果你的自定义UIView在setFrame方法中进行一些高级布局(例如放置和调整子视图),可能会导致更多的双重工作.您可以通过为UIViewController已经向调用者请求CGRect 的专用初始化方法来阻止这种情况,CGRect将存储在ivar中.在调用loadView方法时,使用此ivar创建视图.

去这儿的好方法是什么?或者设置视图的框架两次(初始化CGRectZero,事后设定),或给予 …

iphone model-view-controller uiviewcontroller uiview

28
推荐指数
1
解决办法
2万
查看次数

在一对一的每个具体类表结构中创建外键

TL; DR如何强制Hibernate模式创建,以便在每个具体的表设置AbstractProperty.ownerIdOwner.ownerId为下面显示的结构创建外键约束,而不向?添加Owner属性AbstractProperty

我正在开发一个项目,我有以下类结构:

类结构样本

Owner与a的一对一映射AbstractProperty,由ConcreteProperty类扩展(和其他类似的AnotherProperty,但这与此问题的其余部分并不相关).

AbstractProperty实际上只有一个属性的abstractPropertyId.为此,我们要使用的表,每具体类结构,表结束了Owner,ConcreteProperty和表格的其他AbstractProperty扩展类(AnotherProperty).

为此,我创建了以下映射Owner:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
    <class name="Owner">
        <id name="ownerId">
            <generator class="identity"/>
        </id>
        <property name="ownerProperty"/>
        <one-to-one name="abstractProperty"/>
    </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

对于AbstractProperty:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
    <class …
Run Code Online (Sandbox Code Playgroud)

java orm hibernate

23
推荐指数
1
解决办法
1677
查看次数

按字符串键x访问数组,其中x为"123"

我们有一个数组,其中键是字符串,但这些字符串有时只是数字(例如"123").当尝试通过键"123"访问数组时,我们得到一个未定义的索引通知.当仅通过整数123访问它时,我们得到Undefined Offset通知.这告诉我们我们正在尝试使用"123"字符串正确地对其进行索引,但它仍未设置.

试图为这个SO问题提出一个例子,这很难,因为PHP会自动将我们的测试用例中的数组键转换为整数,而在我们的实际应用程序中,这不会发生(由于使用了Java Bridge).我们现在尝试的测试数组是:

<?php
$array = array("123" => array(108, 8));
var_dump($array);
?>
Run Code Online (Sandbox Code Playgroud)

返回:

array(1) { [123]=> array(2) { [0]=> int(108) [1]=> int(8) } }
Run Code Online (Sandbox Code Playgroud)

在我们的现实世界中,它会返回:

array(1) { ["123"]=> array(2) { [0]=> int(108) [1]=> int(8) } }
Run Code Online (Sandbox Code Playgroud)

所以在现实世界中,索引实际上是一个字符串:

<?php
var_dump(array_keys($array));
?>
Run Code Online (Sandbox Code Playgroud)

回报

array(1) { [0]=> string(3) "123" }
Run Code Online (Sandbox Code Playgroud)

所以,最后问题是以下代码的输出:

<?php
foreach ($array as $key => $value) {
    if (!isset($array[$key])) {
        print "What is happening here?";
    }
} 
?>
Run Code Online (Sandbox Code Playgroud)

这使:

What is happening here?
Run Code Online (Sandbox Code Playgroud)

根据Yoshi的评论,这里的工作测试代码:

<?php
$array = (array)json_decode('{"123":[108,8]}');
foreach ($array …
Run Code Online (Sandbox Code Playgroud)

php arrays

5
推荐指数
1
解决办法
1076
查看次数

如何在代码中引用Resources文件夹

我正在将一个c ++ Qt应用程序从Windows移植到OSX,无法绕过.app包概念.我希望有人能帮助我理解.

我的可执行文件存在于此处:MyProgram.app/Content/MacOS/MyProgram.exe

我的资源文件夹位于此处:MyProgram.app/Content/Resources/

在我的代码中,我使用相对路径来引用资源文件夹中的项目:

"../Resources/something.png"

如果我打开.app包并直接运行.exe,这很有用.

但这不是.app包的工作方式.用户应该在Finder中单击.app包以运行该程序.但在那种情况下,我的相对路径不再有效,这是我不明白的.

有谁理解我的问题以及如何解决它?

c++ macos qt bundle

2
推荐指数
1
解决办法
6336
查看次数