iOS Segue 跳转

需求

现在有2个View,第一个View(SummaryView)中包含了一个TableView,第二个View(DetailView)中包含了一个TextView,其内容显示的是对应第一个TableView中的某一行的详细内容。当点击SummaryView中的某一行后,跳转到DetailView显示其详细信息。 Alt none

显示摘要信息的TableView Alt none

显示详细信息的View

自动跳转

自动跳转的方式极其简单,甚至不需要自己写任何一行代码,但是它存在一些数据传递的问题,这个问题的下次在说。 选中TableView中的TableViewCell,使用快捷键(Ctrl + 3指)跟DetailView中的DetailViewController建立一个Segue,在弹出的菜单中选择Push。建立Segue后如下图: Alt none

Segue

选中Segue打开Attribute inspector,设置Identifier为showDetail。 Alt none

选择Segue

Alt none

设置Segue标识

prepareForSegue:sender方法会在View跳转的时候被回调, 可以在这里处理一些跳转过程事务:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        NSLog(@"prepareForSegue:sender invoked: %@", self.description);
    }
}

前面说过使用自动跳转的方法会有一些局限性,比如数据的传递问题。很多时候还是需要使用代码的方式来手动跳转。

手动跳转

同样的需要在SummaryView和DetailView之间建立Segue,但是这次不是在TableViewCell和DetailViewController之间,而是在SummaryViewController(TableView所在的ViewController)和DetailViewController之间建立Segue。 选中SummaryViewController,使用快捷键(Ctrl + 3指)跟DetailViewController建立一个Segue,在弹出的菜单中选择Push。 Alt none

选中SummaryViewController Alt none

建立Segue后的状态

跟第一种方法一样设置Segue的Identifier为showDetail。

最后调用performSegueWithIdentifier:sender:实现View跳转:

[self performSegueWithIdentifier:@"showDetail" sender:self];

iOS CGRectInset

dx, dy为正

    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 500, 500)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    
    UIView *blueView = [[UIView alloc]init];
    blueView.frame = CGRectInset(redView.frame, 50, 50);
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];

Alt none

dx, dy为负

    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 500, 500)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    
    UIView *blueView = [[UIView alloc]init];
    blueView.frame = CGRectInset(redView.frame, -50, -50);
    blueView.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:0.5];
    [self.view addSubview:blueView];

注意blueView加了50%的透明,否则redView被完全覆盖 Alt none

Objc 中 nil Nil NULL NSNull 之间的区别

nil

#ifndef nil
     #define nil __DARWIN_NULL    /* id of Nil instance */
#endif

Nil

#ifndef Nil
     #define Nil __DARWIN_NULL    /* id of Nil class */
#endif

NULL

#ifndef NULL
    #define NULL    __DARWIN_NULL
#endif /* ! NULL */

NSNull

NSNull is a class defines a singleton object used to represent null values in collection objects (which don’t allow nil values).

[NSNull null]: The singleton instance of NSNull.
#import <Foundation/NSObject.h>
@interface NSNull : NSObject <NSCopying, NSCoding>
   + (NSNull *)null;
@end

Android onTouchEvent and TouchListener 的执行流程

public boolean dispatchTouchEvent(MotionEvent event) {
	if (mInputEventConsistencyVerifier != null) {
		mInputEventConsistencyVerifier.onTouchEvent(event, 0);
	}

	if (onFilterTouchEventForSecurity(event)) {
		// noinspection SimplifiableIfStatement
		ListenerInfo li = mListenerInfo;
		if (li != null && li.mOnTouchListener != null
				&& (mViewFlags & ENABLED_MASK) == ENABLED
				&& li.mOnTouchListener.onTouch(this, event)) {
			return true;
		}

		if (onTouchEvent(event)) {
			return true;
		}
	}

	if (mInputEventConsistencyVerifier != null) {
		mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);
	}
		return false;
}

所有,如果在注册的TouchListener中返回了true, 那么你自定义View中的onTouchEvent()方法就执行不到咯。ref: frameworks/base/core/java/android/view/View.java

Android Wear 调试方法

通过USB

adb -d forward tcp:5601 tcp:5601

通过蓝牙

  1. 在手机端打开Android Wear应用

  2. 点击界面右上的菜单并选择设置(Settings)

  3. 开启“通过蓝牙调试”(Debugging over Bluetooth)。你可以看到设备连接状态:
    Host: disconnected Target: connected
    
  4. 手机用usb连接电脑,并执行adb命令:
    adb forward tcp:4444 localabstract:/adb-hub
    adb connect localhost:4444
    

    你就可以看到刚才的连接状态就变成了:

Host: connected Target: connected