Как я совместно использую объект между UIViewControllers на iPhone?

Вам нужно к scp что-то где-нибудь. Вы имеете scp ./styles/, таким образом, Вы говорите безопасную копию ./styles/, но не, где скопировать ее в.

Обычно, если Вы хотите загрузить, это пойдет:

# download: remote -> local
scp user@remote_host:remote_file local_file 

, где local_file мог бы на самом деле быть каталог для помещения файла, Вы копируете в. Для загрузки это - противоположное:

# upload: local -> remote
scp local_file user@remote_host:remote_file

, Если Вы хотите скопировать целый каталог, Вам будет нужно -r. Думайте scp так же как cp, кроме Вас может определить файл с user@remote_host:file, а также просто локальные файлы.

Редактирование: Как отмечено в комментарии, если имена пользователей на локальных и удаленных хостах являются тем же, то пользователь может быть опущен при определении удаленного файла.

23
задан shashank 24 May 2013 в 10:11
поделиться

4 ответа

Дополнение до двух позволяет суммировать отрицательные и положительные числа без какой-либо специальной логики.

Если вы пытались сложить 1 и -1, используя свой метод
10000001 (-1)
+00000001 (1)
вы получите
10000010 (-2)

Вместо этого, используя дополнение до двух, мы можем добавить

11111111 (-1)
+00000001 (1) вы получите
00000000 (0)

То же самое и с вычитанием.

Кроме того, если вы попытаетесь вычесть 4 из 6 (два положительных числа), вы можете дополнить 2 до 4 и сложить два вместе 6 + (-4) = 6 - 4 = 2

Это означает, что вычитание и сложение как положительных, так и отрицательных чисел может выполняться одной и той же схемой в процессоре.

Вы упомянули контроллер панели вкладок. Если ваши контроллеры представления подключены через IB, все, что вам нужно сделать, это установить эти параметры в методе делегата приложения applicationDidFinishLaunching: , прежде чем отобразится контроллер панели вкладок:

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{

    MyDataModel *model;
    AViewController *aViewController;
    BViewController *bViewController;
    ...
}

@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;

@end

@implementation MyAppDelegate

...

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...

    aViewController.model = model;

    bViewController.model = model;

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
}

Не забудьте отпустить модель в методе dealloc вашего контроллера представления.


Альтернативой является использование одноэлементного объекта. Простой пример синглтона:

@interface MyDataModel : NSObject
{
}

+ (MyDataModel *) sharedDataModel;

@end

@implementation MyDataModel

static MyDataModel *sharedDataModel = nil;

+ (MyDataModel *) sharedDataModel
{

    @synchronized(self)
    {
        if (sharedDataModel == nil)
        {
            sharedDataModel = [[MyDataModel alloc] init];
        }
    }
    return sharedDataModel;
}

@end

Вы можете получить доступ к этой модели данных со всех ваших контроллеров представления с помощью чего-то вроде следующего:

MyDataModel *model = [MyDataModel sharedDataModel];

См. Также это обсуждение переполнения стека по поводу синглтонов.

, до отображения контроллера панели вкладок:

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{

    MyDataModel *model;
    AViewController *aViewController;
    BViewController *bViewController;
    ...
}

@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;

@end

@implementation MyAppDelegate

...

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...

    aViewController.model = model;

    bViewController.model = model;

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
}

Не забудьте освободить модель в методе dealloc вашего контроллера представления.


Альтернативой является использование одноэлементного объекта. Простой пример синглтона:

@interface MyDataModel : NSObject
{
}

+ (MyDataModel *) sharedDataModel;

@end

@implementation MyDataModel

static MyDataModel *sharedDataModel = nil;

+ (MyDataModel *) sharedDataModel
{

    @synchronized(self)
    {
        if (sharedDataModel == nil)
        {
            sharedDataModel = [[MyDataModel alloc] init];
        }
    }
    return sharedDataModel;
}

@end

Вы можете получить доступ к этой модели данных со всех ваших контроллеров представления с помощью чего-то вроде следующего:

MyDataModel *model = [MyDataModel sharedDataModel];

См. Также это обсуждение переполнения стека по поводу синглтонов.

перед отображением контроллера панели вкладок:

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{

    MyDataModel *model;
    AViewController *aViewController;
    BViewController *bViewController;
    ...
}

@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;

@end

@implementation MyAppDelegate

...

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...

    aViewController.model = model;

    bViewController.model = model;

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
}

Не забудьте освободить модель в методе dealloc вашего контроллера представления.


Альтернативой является использование одноэлементного объекта. Простой пример синглтона:

@interface MyDataModel : NSObject
{
}

+ (MyDataModel *) sharedDataModel;

@end

@implementation MyDataModel

static MyDataModel *sharedDataModel = nil;

+ (MyDataModel *) sharedDataModel
{

    @synchronized(self)
    {
        if (sharedDataModel == nil)
        {
            sharedDataModel = [[MyDataModel alloc] init];
        }
    }
    return sharedDataModel;
}

@end

Вы можете получить доступ к этой модели данных со всех ваших контроллеров представления с помощью чего-то вроде следующего:

MyDataModel *model = [MyDataModel sharedDataModel];

См. Также это обсуждение переполнения стека по поводу синглтонов.

32
ответ дан 29 November 2019 в 01:41
поделиться

Самый распространенный способ, который я видел, - это настроить то, к чему вы хотите получить доступ, в делегате приложения и ссылаться на него в других местах, например так:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
myStuff = appDelegate.stuff;

В делегате приложения, настройте переменную материала и используйте @property и @synthesize как обычно.

Некоторые люди говорят, что это не лучший подход, поскольку он аналогичен использованию глобальных переменных, но очень распространен.

8
ответ дан 29 November 2019 в 01:41
поделиться

Мне нравится создавать класс модели верхнего уровня, который является одноэлементным и содержит все элементы, которые могут мне понадобиться.

Также полезно предоставить ему метод загрузки верхнего уровня, который заполняет объекты просто ключи db, используя шаблон hydrate / dehydrate, общий в примерах Apple.

Типичное использование в делегате приложения будет просто,

[[MyModel sharedModel] load];

А затем в контроллере представления:

NSArray *myThing1s = [[MyModel sharedModel] thing1s];
NSArray *myThing2s = [[MyModel sharedModel] thing2s];

Затем вы можете перебирать свои вещи и thing2s, и когда вам нужны подробности, вы можете просто вызвать

[myThing1 hydrate];

, который заполнит объект.

Конечно, вы, вероятно, захотите использовать CoreData для управления постоянством, начиная с версии 3.0.

5
ответ дан 29 November 2019 в 01:41
поделиться

Оба контроллера представления должны ссылаться на третий объект (C) в качестве источника данных; этот объект (C), содержащий все сохраненные данные приложения.

C в этом случае будет M в MVC.

Добавьте к каждому из ваших ViewController следующие объявления:

// SomeViewController.h
// Before @interface

@class MyDataSource;

// In the interface

IBOutlet MyDataSource *datasource;
@property(retain) IBOutlet MyDataSource *datasource;
0
ответ дан 29 November 2019 в 01:41
поделиться