我刚刚开始使用Swift.我已经阅读了这本书,并且在学习的过程中我学到了更多东西.
我想子类UIView并显示像视图一样的登录.我在Objective-C中创建了这个,但现在我想把它移植到Swift.我不使用故事板,所以我在代码中创建了所有的UI.
但第一个问题是我必须实施initWithCoder.我给它一个默认的实现,因为它不会被调用.现在,当我运行该程序时,它崩溃了,因为我也要实现initWithFrame它.现在我明白了:
override init() {
super.init()
println("Default init")
}
override init(frame: CGRect) {
super.init(frame: frame)
println("Frame init")
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
println("Coder init")
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我应该在哪里创建我的文本域等...如果我从未实现框架和编码器,我怎么能"隐藏"这个?
我正在学习Vim,但我认为这是一项简单的任务,但我无法让它发挥作用.我有浏览器SO,但解决方案对我不起作用.
我正在尝试正确缩进文件(xml).我使用的命令是:
gg=G
Run Code Online (Sandbox Code Playgroud)
或ggVG =(自己做这个可能会做一些不同的事情;))
我的.vimrc是:
syntax on
filetype plugin indent on
set nu
Run Code Online (Sandbox Code Playgroud) 我一直在检查iOS 9作为开发人员的新功能,其中一些像StackView看起来很棒.
当我去UIStackView的头文件时,我看到了这个:
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *arrangedSubviews;
Run Code Online (Sandbox Code Playgroud)
什么是NSArray*的__kindof.我们现在能够在NSArray*上指定类型吗?
小测试:
@interface DXTEST ()
@property (strong, nonatomic) NSMutableArray <__kindof NSString *> *strings;
@end
@implementation DXTEST
- ( instancetype ) init {
self = [super init];
if( self ) {
_strings = [NSMutableArray new];
[_strings addObject:@(1)]; <-- compiler warning wieeeeee
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud) 我正在学习斯坦福大学视频中的块.我现在处于解释核心数据的部分.老师们提到了一些事情:
- (void)openWithCompletionHandler:(void (^)(BOOL success))completionHandler;
Run Code Online (Sandbox Code Playgroud)
他说,将在调用方法的线程中调用completionhandler块.所以基本上该方法运行async但是在线程上调用块,让我们假设main.
所以我的问题是在进行方法调用的线程上运行所有块.为了说明为什么我问这个问题,我有一个Async类,它向服务器请求.
所有这些方法的格式如下:
- (void) getSomething:(id <delegateWhatever> const)delegate{
goto background thread using GCD..
Got result from server...
Go back to main thread and call the delegate method...
}
Run Code Online (Sandbox Code Playgroud)
当我使用块时,我不需要担心回到主线程,如果它们将在调用的地方被调用?
希望这很清楚,
提前致谢
我想根据宽度是否大于高度来改变我的布局.但我不断收到布局警告.我在自适应布局上观看了两个WWDC视频,这些视频帮了很多但没有解决问题.我使用以下代码创建了一个简单版本的布局.这只是让人们可以重现我的问题.代码在iPhone 7 plus上运行.
import UIKit
class ViewController: UIViewController {
var view1: UIView!
var view2: UIView!
var constraints = [NSLayoutConstraint]()
override func viewDidLoad() {
super.viewDidLoad()
view1 = UIView()
view1.translatesAutoresizingMaskIntoConstraints = false
view1.backgroundColor = UIColor.red
view2 = UIView()
view2.translatesAutoresizingMaskIntoConstraints = false
view2.backgroundColor = UIColor.green
view.addSubview(view1)
view.addSubview(view2)
layoutPortrait()
}
func layoutPortrait() {
let views = [
"a1": view1,
"a2": view2
]
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[a1]|", options: [], metrics: nil, views: views)
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[a2]|", options: [], metrics: nil, views: views)
constraints += …Run Code Online (Sandbox Code Playgroud) 我是Android应用开发的初学者.我的问题非常简单.我似乎无法确定布局文件夹中的xml文件是否应该以:
<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)
当我做一个启动项目时,它不存在.但我也在读一本书,上面写着应该在那里?
什么是正确的方法?
我用点击手势识别器制作了一个可点击的视图,工作得很好.但我希望在触摸发生时突出显示视图,并在触摸结束时将其移除.
我试过这个:
- (IBAction)refresh:(UITapGestureRecognizer *)sender {
if(self.currentStatus == NODATA){
if(sender.state == UIGestureRecognizerStateBegan){
NSLog(@"Began!");
[self.dashboardViewController.calendarContainer state:UIViewContainerStatusSELECTED];
}
if (sender.state == UIGestureRecognizerStateEnded){
NSLog(@"%@", @"Ended");
[self.dashboardViewController.calendarContainer state:UIViewContainerStatusNORMAL];
}
[self setState:REFRESHING data:nil];
}
}
Run Code Online (Sandbox Code Playgroud)
"Ended确实"的NSLog显示但是开始没有显示,所以它永远不会被选中.为什么是这样?
我UITableView有很多不同的观点.在UITableView数据源的每个方法中,我需要检查单元格的类型和对象的类型,强制转换它们并正确操作.这不是很干净(它有效)但不是很容易维护.
所以我正在努力抽象这一部分,但我有点卡住了.以下代码是简化的,可能没那么有用,但它是为了演示我当前的问题:
extension UITableView {
func dequeue<T: UITableViewCell>(_ type: T.Type,
for indexPath: IndexPath) -> T {
let cell = dequeueReusableCell(withIdentifier: String(describing: type),
for: indexPath)
guard let cellT = cell as? T else {
fatalError("Dequeue failed, expect: \(type) was: \(cell)")
}
return cellT
}
}
struct Row<Model, Cell> {
let view: Cell.Type
let model: Model
var fill: ((Model, Cell) -> Void)
}
// Completly unrelated models
struct Person {
let name: String
}
struct Animal {
let …Run Code Online (Sandbox Code Playgroud) 我已经在-Xfrontend -warn-long-expression-type-checking=50我的 Swift 项目中添加了这个标志,看看是什么花费了太长时间。我有以下表达式:
let s: String = "1234"
let t: Int? = Int(s)
Run Code Online (Sandbox Code Playgroud)
在Int(s)我收到警告Expression took 52ms to type-check (limit: 50ms)。我只是想知道为什么这需要超过 50 毫秒才能弄清楚,因为我指定了所有类型。
我已经制作了一个自定义吐司库(非常简单,只是一个出现在导航栏下面的框).哪个在我的目标群体iOS 6中运行良好.但是自从iOS 7发布以来它没有正确显示.
我试图解决它的方式是通过这段代码:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7,0")){
self.offset = [UIApplication sharedApplication].statusBarFrame.size.height + self.viewController.navigationController.navigationBar.frame.size.height;
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个宏,可以在Stack overflow上找到,以检测iOS版本是否为7,然后添加状态栏高度和导航高度.这在iOS 7中以纵向模式正常工作,但当我切换到横向偏移变为512?时.
任何人都可以解释这种情况发生的方式以及如何解决这个问题?
决定拆分代码,因为评论,看看究竟是什么导致了差异.我做的是:
CGFloat statusBarHeight = [UIApplication sharedApplication] .statusBarFrame.size.height;
CGFloat navBar = self.viewController.navigationController.navigationBar.frame.size.height;
self.offset = statusBarHeight + navBar;
NSLog(@"Init - statusBarHeight: %f, navBar: %f", statusBarHeight, navBar);
Run Code Online (Sandbox Code Playgroud)
事实证明,状态栏在纵向20和景观中是480
这是因为高度和宽度转过来,回答来自评论
ios ×7
swift ×4
objective-c ×3
android ×1
autolayout ×1
cocoa-touch ×1
ios7 ×1
statusbar ×1
uitableview ×1
vim ×1
xcode ×1
xml ×1