- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在创建一个包含大量自定义 View 的 iOS 应用程序,因此无法使用默认的 Cocoa View 。然后,我决定采用Coordinating/Mediator Controller 设计模式(在 Apress - Pro Objective-C Design Patterns for iOS 中学习)。
我从委托(delegate)中创建了一个指向协调 Controller 中的 View 的 rootViewController:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
coordinatingController = [C6CoordinatingController sharedInstance];
self.window.rootViewController = coordinatingController.activeVC;
[self.window makeKeyAndVisible];
return YES;
然后,在协调 Controller 中,我有单例创建方法:
+ (C6CoordinatingController *) sharedInstance{
if (sharedCoordinator == nil){
C6Log(@"New Shared Coordinator");
sharedCoordinator = [[super allocWithZone:NULL] init];
[sharedCoordinator initialize];
}
else {
C6Log(@"Return Singleton Shared Coordinator");
}
return sharedCoordinator;
}
+ (id) allocWithZone:(NSZone *)zone{
return [self sharedInstance];
}
- (void) initialize{
C6Log(@"");
[self checkDevice];
_mainVC = [C6MainViewController initWithDevice:device];
_activeVC = _mainVC;
[self checkLanguage];
[self chooseFirstView];
}
我还有一个选择器可以选择第一个 View (我目前只有两个):
-(void) chooseFirstView{
// If a language was not setted, go to language settings view
if (!language) {
C6Log(@"Going to Language Settings");
C6LanguageSettingsViewController *languageVC = [C6LanguageSettingsViewController initWithDevice:device];
[_mainVC.view addSubview:languageVC.view];
}
else {
C6Log(@"Going to User Settings", language);
C6AccountSettingsViewController *accountVC = [C6AccountSettingsViewController initWithDevice:device];
[_mainVC.view addSubview:accountVC.view];
}
}
然后,我有一个 IBAction 供我的 View 使用:
- (IBAction) requestViewChangeByObject:(id)object {
int buttonTag = [object tag]; // dividend
int viewTag = buttonTag / divisor; // quotient
int actionTag = buttonTag - (divisor * viewTag); // remainder
C6Log(@"viewTag: %d | actionTag %d", viewTag, actionTag);
switch (viewTag) {
case LanguageTags:
C6Log(@"LanguageTags");
break;
case AccountTags:
C6Log(@"AccountTags");
break;
default:
break;
}
在 NIB 中,我创建了一个对象(协调 Controller ),并从那里调用了 IBAction。效果很好,我可以改变我的看法(仍然需要实现)…………
但是……我也想更改语言,但是,因为这不是导航问题,所以我想从 C6LanguageSettingsViewController 而不是 C6CoodinatingController 进行。
因此,我在 C6LanguageSettingsViewController 中创建了另一个 IBAction:
- (IBAction)chooseLang:(id)sender{
UIImage *bt;
[self resetImagesToNormalState];
C6Log(@"");
C6Log(@"%@", [sender tag]);
C6Log(@"%@", sender);
.
.
.
当我将按钮连接到此 IBAction(通过文件所有者或通过 LanguageSettingsViewController 对象)时,应用程序中断,有时它没有显示任何错误,有时它会显示 Unrecognized selector sent to instance 或UIApplicationMain 中的EXC_BAD_ACCESS (Code=1, address = 0x…………)
我认为问题是 NIB 没有找到文件的所有者……但我不确定如何解决它。
最佳答案
好吧……这看起来很荒谬,但我在回答自己:P
我设法让它工作(终于!),我发现我正在以 BAAAAD 的方式管理 viewControllers,所以,我更改了协调 Controller 中的一些代码:
首先,我没有带 NIB 和 stuf 的“真正的”mainViewController……
旧初始化
- (void) initialize{
C6Log(@"");
[self checkDevice];
_mainVC = [C6MainViewController initWithDevice:device];
_activeVC = _mainVC;
[self checkLanguage];
[self chooseFirstView];
}
NEW初始化
- (void) initialize{
C6Log(@"");
[self checkDevice];
[self checkLanguage];
[self chooseFirstView];
}
checkDevice 验证它是 iPhone 还是 iPad,因此我可以选择正确的 Nib 。
checkLanguage 检查语言的 [NSUserDefaults standardUserDefaults]
最后,我调用 chooseFirstView:
老选择FirstView
-(void) chooseFirstView{
// If a language was not setted, go to language settings view
if (!language) {
C6Log(@"Going to Language Settings");
C6LanguageSettingsViewController *languageVC = [C6LanguageSettingsViewController initWithDevice:device];
[_mainVC.view addSubview:languageVC.view];
}
else {
C6Log(@"Going to User Settings", language);
C6AccountSettingsViewController *accountVC = [C6AccountSettingsViewController initWithDevice:device];
[_mainVC.view addSubview:accountVC.view];
}
}
新的 chooseFirstView
-(void) chooseFirstView{
// If a language was not setted, go to language settings view
_activeVC = [[UIViewController alloc] init];
UIImage *bgImage = [UIImage imageNamed:@"bg.png"];
UIImageView *bgView = [[UIImageView alloc] initWithImage:bgImage];
[_activeVC.view addSubview:bgView];
if (!language) {
C6Log(@"Going to Language Settings");
languageVC = [C6LanguageSettingsViewController initWithDevice:device];
[_activeVC.view addSubview:languageVC.view];
}
else {
C6Log(@"Going to User Settings", language);
accountVC = [C6AccountSettingsViewController initWithDevice:device];
[_activeVC.view addSubview:accountVC.view];
}
}
最大的变化是我何时以及如何启动 _activeVC……以及 _languageVC 和 _accountVC 现在都是全局变量这一事实。
好吧,在此更改之后,NIB 按钮调用两个 IBAction 方法:它是文件的所有者和协调 Controller 。
使用这种模式的另一件大事是如何在不爆炸 iOS 设备内存的情况下从一个 View 更改为另一个 View ……以下是我在协调 Controller 中的操作方式:
- (IBAction) requestViewChangeByObject:(id)object {
int buttonTag = [object tag]; // dividend
int viewTag = buttonTag / divisor; // quotient
int actionTag = buttonTag - (divisor * viewTag); // remainder
C6Log(@"ViewTag: %d", viewTag);
switch (viewTag) {
case LanguageTags:{
C6Log(@"LanguageTags - button %d", actionTag);
accountVC = [C6AccountSettingsViewController initWithDevice:device];
UIView *fromView = languageVC.view;
UIView *toView = accountVC.view;
[self switchFrom:fromView To:toView usingAnimation:AnimationPushFromRigh];
}
break;
case AccountTags:{
C6Log(@"AccountTags - button %d", actionTag);
switch (actionTag) {
case 0:{
C6Log(@"Go back");
languageVC = [C6LanguageSettingsViewController initWithDevice:device];
UIView *fromView = accountVC.view;
UIView *toView = languageVC.view;
[self switchFrom:fromView To:toView usingAnimation:AnimationPushFromLeft];
}
break;
default:
break;
}
}
break;
default:
break;
}
}
在方法的开头,我做了很多数学运算……我“创建”了一个模式,其中每个 NIB 的标签都应该以 100 的倍数开头……所以,语言以 0 开头,帐户以 100 开头…………
#define divisor 100
#define LanguageTags 0
#define AccountTags 1
然后,我从一个 View 更改为另一个 View 的方式就在那里:
-(void) switchFrom:(UIView*) fromView To:(UIView*) toView usingAnimation:(int) animation{
C6Log(@"");
/*************** SET ALL DEFAULT TRANSITION SETTINGS ***************/
// Get the current view frame, width and height
CGRect pageFrame = fromView.frame;
CGFloat pageWidth = pageFrame.size.width;
// Create the animation
[UIView beginAnimations:nil context:nil];
// Create the delegate, so the "fromView" is removed after the transition
[UIView setAnimationDelegate: fromView];
[UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];
// Set the transition duration
[UIView setAnimationDuration: 0.4];
// Add the "toView" as subview of "fromView" superview
[fromView.superview addSubview:toView];
switch (animation) {
case AnimationPushFromRigh:{
// Position the "toView" to the right corner of the page
toView.frame = CGRectOffset(pageFrame, pageWidth,0);
// Animate the "fromView" to the left corner of the page
fromView.frame = CGRectOffset(pageFrame, -pageWidth,0);
// Animate the "toView" to the center of the page
toView.frame = pageFrame;
// Animate the "fromView" alpha
fromView.alpha = 0;
// Set and animate the "toView" alpha
toView.alpha = 0;
toView.alpha = 1;
// Commit the animation
[UIView commitAnimations];
}
break;
case AnimationPushFromLeft:{
// Position the "toView" to the left corner of the page
toView.frame = CGRectOffset(pageFrame, -pageWidth,0);
// Animate the "fromView" to the right corner of the page
fromView.frame = CGRectOffset(pageFrame, pageWidth,0);
// Animate the "toView" to the center of the page
toView.frame = pageFrame;
// Animate the "fromView" alpha
fromView.alpha = 0;
// Set and animate the "toView" alpha
toView.alpha = 0;
toView.alpha = 1;
// Commit the animation
[UIView commitAnimations];
}
break;
default:
break;
}
}
我真的希望这对尝试使用这种协调 Controller 模式的人有所帮助 :P
关于iphone - Cocoa Touch 中的协调 Controller 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10834826/
我对这个话题有点怀疑。 情况: 我进行了一项研究,其中指出 Sencha Touch 2 (further Sencha) 和 DHTMLX Touch (further DHTMLX) 是可供选择的
我的移动应用程序目前在 Sencha Touch 1.1.1 下运行。现在,我想将其升级到 Sencha Touch 2.0。有人可以帮我做这件事吗?升级时我应该注意哪些一般步骤? 另外,是否有帮助该
在他们的文档中找不到指定了所有日期时间格式的位置? 我想要一个日期看起来像这样 13 Jan 2013 我发现了这个模式: date("F j, Y") 但这给了我很长的月份名称。 (不知道为什么他们
我需要一个简单的嵌套 ListView 示例。沿着这条线的东西...... (来源:roosteronacid.com) 当您单击一个项目时,您将转换(滑动)到包含另一个列表的下一个 View /卡片
scons 使用 MD5 哈希值而不是文件修改时间来确定是否需要构建依赖项。 我希望这是默认行为。但是,除了编辑文件以使其不同之外,是否有任何方法可以强制它假设特定文件已过期(相当于“触摸”)? 编辑
我有一个 sencha touch 显示在列表中的联系人列表。然后,当您单击列表中的姓名时,它应该向右滑动并说您好 {联系人姓名}!但是当它现在滑过时,它只是说你好!第 29 行是项目点击的 Acti
我是一名 Ext 老手,但我需要创建一些相当简单的移动应用程序,自然而然我正在研究 sencha touch。 Ting 是 - 大多数示例无法在 Firefox/Opera 中运行。 我很高兴使用
只是想知道在 Sencha Touch 中是否有处理该问题的方法。一个商店,应用不同的过滤器后,商店可以用于不同的地方。 例如: 我有一家商店: Ext.regModel('abc', { f
如何覆盖浏览器后退按钮的功能?我在页面中有导航 View ,我想同步浏览器后退按钮和导航 View 的后退按钮。我可以覆盖导航按钮的功能,但我不知道如何为浏览器返回做同样的事情。 我们将不胜感激。 最
如何使用两个 Action 创建 UIButton。 我知道通过使用 UILongPressGestureRecognizer 我们可以执行 Longpress。 但我的要求是,当我长按 UIButt
如何在 Ext.panel 中动态添加新项目?这是我正在使用的代码; app.views.ViewItem = Ext.extend(Ext.Panel, { id: '0', doc
我有一个全屏按钮(我将其放置在 IB 中),其中包含一个图像,当用户单击它时,我希望将其滑出屏幕。我知道连接正常,因为单击按钮时我可以记录一些内容。但是我之前用来移动 UIViews 和 UIImag
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
大家好,我目前正在为 iPhone 开发一款节奏游戏,只是想知道是否有人对用于 react 时间的最佳作品有任何想法。 我已经完成了所有编码,并将其范围缩小到大约 2 种方式: 1:使用绕过 UICo
我正在尝试使用XCode编码计算器,但是后来我看到带有逗号的数字只是在逗号后被切掉了。 我正在用文本代码获取带有此代码的数字。 -(IBAction)Additionbutton:(id)sender
Sencha Touch 中是否有控件可以显示如下图所示的密码字段? 最佳答案 不,没有本地组件可以做到这一点。但是您可以自己构建它:它是一个包含 4 个输入字段和十几个按钮的表单。有关详细信息,请参
出于某种原因,我的表单面板没有显示。谁能帮忙?如果这很明显,我是新手,很抱歉!它是用 Sencha Architect 构建的,但我不明白为什么没有字段显示在表单中?... Ext.define('M
我创建了一个基于表格的模板,因此我可以获得类似网格的感觉。我的问题是,当我单击表格行时,如何弹出警报(带有 td 信息)。 这是我的 getUserList.js 文件 Ext.regMode
他们无论如何要更改圆形矩形按钮的白色部分而不制作自定义按钮吗? 最佳答案 嗯,差不多。您必须将其设置为自定义但不继承 UIButton。那么你应该能够做类似的事情 myButton.layer.cor
有人可以给我指点 Sencha Touch 和 Javascript 的初学者教程吗?我对 HTML 和 Javascript & CSS 知之甚少。我需要学习高级 Javascript 和指南针/主
我是一名优秀的程序员,十分优秀!