在2011年WWDC会话102,苹果推出视图控制器遏制,这是创建定制的视图控制器容器的能力,类似于UITabBarController
,UINavigationController
和类似物.
我多次看过这些例子.有一系列与这种模式相关的方法,但有点难以弄清楚它们.我将在这里发布我认为正在发生的事情,看看社区是否会确认或否定我的怀疑.
场景1:从无父节点移动到新的父视图控制器
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
前两行必须按给定的顺序发生,还是可以反转?
场景2:从父视图控制器移动到没有父视图控制器
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Run Code Online (Sandbox Code Playgroud)
还有必要打电话[vc didMoveToParentViewController:nil]
吗?会话102中的示例在这种情况下没有这样做,但我不知道这是否是遗漏.
场景3:从一个父视图控制器移动到另一个父视图控制器
这可能以下列方式发生,因为将封装每个父视图控制器中的逻辑.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
问题
我的主要问题是:一般来说,视图控制器包含应该如何工作?上面给出的机制是否正确?
是否有必要在打电话willMoveToParentViewController
前打电话addChildViewController
?这对我来说似乎是合乎逻辑的顺序,但它是否是必要的?
打电话didMoveToParentViewController:nil
后有必要打电话removeFromParentViewController
吗?
我完全理解为什么会出现未使用的变量警告.我不想一般地压制它们,因为它们在大多数情况下非常有用.但是,请考虑以下(人为)代码.
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
Run Code Online (Sandbox Code Playgroud)
Xcode报告这saved
是一个未使用的变量,当然它不是.我怀疑这是因为NSAssert1
是一个宏.该NS_BLOCK_ASSERTIONS
是宏没有定义,那么目标C断言肯定启用.
虽然它没有伤害任何东西,但我发现它不整洁且烦人,我想压制它,但我不知道该怎么做.将变量分配给自己可以摆脱编译器警告,但如果存在这样的事情,我宁愿以"正确"的方式进行.
我正在尝试从命令行创建数据库.我的SO是centos,postgres是9.2
sudo -u postgres psql createdb test
Password for user test:
Run Code Online (Sandbox Code Playgroud)
为什么用户问我?
为什么我的T4模板有时会在输出文件中附加一个数字,有时不会?例如,在一种情况下,我可能有一个名为的模板文件Foo.tt
,我将得到一个输出文件Foo.cs
.在其他情况下,我将获得一个输出文件Foo1.cs
.在每种情况下,都没有其他 Foo.cs
文件可能导致它附加一个数字.换句话说,它绝对不是任何明显的文件名冲突的结果.
我是一个深度肛门保持开发者,所以我很想知道如何摆脱那个无用的数字后缀.
想象一下,你有一个Swift Character
类型的实例,你想确定它是否是一个成员NSCharacterSet
.NSCharacterSet
的characterIsMember
方法需要unichar
,所以我们需要从获得Character
到unichar
.
我能提出的唯一解决方案是以下,c
我在哪里Character
:
let u: unichar = ("\(c)" as NSString).characterAtIndex(0)
if characterSet.characterIsMember(u) {
dude.abide()
}
Run Code Online (Sandbox Code Playgroud)
我看着Character
但没有任何东西从我身上跳出来作为一种从中获取的方式unichar
.这可能是因为Character
更通用unichar
,所以直接转换不安全,但我只是在猜测.
如果我迭代整个字符串,我会做这样的事情:
let s = myString as NSString
for i in 0..<countElements(myString) {
let u = s.characterAtIndex(i)
if characterSet.characterIsMember(u) {
dude.abide()
}
}
Run Code Online (Sandbox Code Playgroud)
(警告:以上是伪代码,从来没有任何人经营过.)但这并不是我所要求的.
我知道newtype
在编译时擦除类型构造函数作为优化,因此newtype Foo = Foo Int
结果只是一个Int
. 换句话说,我不是在问这个问题。我的问题不是关于什么newtype
。
相反,我试图理解为什么编译器在看到单值data
构造函数时不能简单地应用这种优化本身。当我使用 时hlint
,它足够聪明地告诉我单值data
构造函数应该是newtype
. (我从来没有犯过这个错误,但尝试过看看会发生什么。我的怀疑得到了证实。)
一个反对意见可能是,如果没有newtype
,我们就不能使用GeneralizedNewTypeDeriving
和其他这样的扩展。但这很容易解决。如果我们说……
data Foo m a b = Foo a (m b) deriving (Functor, Applicative, Monad)
Run Code Online (Sandbox Code Playgroud)
编译器可以直接告诉我们我们的愚蠢行为。
newtype
当编译器总是可以自己解决时,为什么我们需要?
是否有可在iPhone上使用的压缩API?我们正在为我们的iPhone应用程序构建一些RESTful Web服务,但我们希望至少压缩一些对话以提高效率.
我不关心格式(ZIP,LHA,等等)是什么,并且它不需要是安全的.
一些受访者指出服务器可以压缩其输出,而iPhone可以消耗它.我们的情景正好相反.我们将压缩内容发布到 Web服务.我们并不关心压缩的另一种方式.
我意识到我可以用一个小的C或Ruby程序来做这个,但我希望我的脚本尽可能少的依赖.
鉴于这一点,如何在OS X上的bash脚本中进行日期数学计算?我见过一个帖子(在另一个网站上)有人做了以下事情:
date -d "-1 day"
但这似乎不适用于OS X.
附录:
有几个人评论并回应说Ruby,Python,Perl等是OS X的标准配置.我熟悉这三种语言,并且可以轻松编写一个可以满足我想要的脚本.事实上,我已经有了用Ruby编写的脚本.
所以也许我应该澄清"外部依赖"的含义.我的意思是,我不希望我的bash脚本必须调用其外部的任何其他脚本.换句话说,我希望它使用OS X的vanilla安装中可用的一些实用程序,并且已经在路径上.
但是,它看起来不可能,所以我将不得不使用我的外部依赖:Ruby脚本.
我目前正在学习迷人的J编程语言,但有一点我无法弄清楚如何过滤列表.
假设我有任意列表3 2 2 7 7 2 9
,我想删除2s,但保持其他一切不变,即我的结果将是3 7 7 9
.我怎么做到这一点?
假设我们有以下目标:
\n所以具体的问题是:我们如何才能使 Swift actor 遵守协议,同时保持隔离?
\nprotocol Zippity {\n func foo()\n}\n\nactor Zappity: Zippity {\n func foo() {} // Doesn\'t compile\n}\n
Run Code Online (Sandbox Code Playgroud)\n我可以用 \xe2\x80\xa6 编译它
\nactor Zappity: Zippity {\n nonisolated func foo() {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6 但这似乎违背了目的。我还尝试声明接口方法async
,但也无法编译。
我可以想到几种合理的解决方法,包括组合、nonisolated async
调用独立方法的方法等,但想看看是否有我遗漏的东西。
swift ×2
actor ×1
bash ×1
compression ×1
concurrency ×1
date-math ×1
haskell ×1
ios ×1
ios5 ×1
iphone ×1
j ×1
macos ×1
objective-c ×1
postgresql ×1
swift5 ×1
t4 ×1
xcode ×1