Dependency injection in UIViewControllers iOS swift
First I checked this post and it wasn't useful
I want to apply dependency injection on navigation from a controller to another,
let's say I have controller A :
import UIKit
class A: UIViewController {
}
and a controller B :
import UIKit
class B: UIViewController {
var name : String!
}
I'm navigating from A to B in this way :
let bViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BVC")
as! B
bViewController.name = "HelloWorld"
self.navigationController?.pushViewController(bViewController, animated: true)
I want to convert my code in order to be using dependency injection through initializers.
can any one advice if this can be done, and if can be done how ??
thnx in advance.
ios swift dependency-injection
add a comment |
First I checked this post and it wasn't useful
I want to apply dependency injection on navigation from a controller to another,
let's say I have controller A :
import UIKit
class A: UIViewController {
}
and a controller B :
import UIKit
class B: UIViewController {
var name : String!
}
I'm navigating from A to B in this way :
let bViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BVC")
as! B
bViewController.name = "HelloWorld"
self.navigationController?.pushViewController(bViewController, animated: true)
I want to convert my code in order to be using dependency injection through initializers.
can any one advice if this can be done, and if can be done how ??
thnx in advance.
ios swift dependency-injection
add a comment |
First I checked this post and it wasn't useful
I want to apply dependency injection on navigation from a controller to another,
let's say I have controller A :
import UIKit
class A: UIViewController {
}
and a controller B :
import UIKit
class B: UIViewController {
var name : String!
}
I'm navigating from A to B in this way :
let bViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BVC")
as! B
bViewController.name = "HelloWorld"
self.navigationController?.pushViewController(bViewController, animated: true)
I want to convert my code in order to be using dependency injection through initializers.
can any one advice if this can be done, and if can be done how ??
thnx in advance.
ios swift dependency-injection
First I checked this post and it wasn't useful
I want to apply dependency injection on navigation from a controller to another,
let's say I have controller A :
import UIKit
class A: UIViewController {
}
and a controller B :
import UIKit
class B: UIViewController {
var name : String!
}
I'm navigating from A to B in this way :
let bViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BVC")
as! B
bViewController.name = "HelloWorld"
self.navigationController?.pushViewController(bViewController, animated: true)
I want to convert my code in order to be using dependency injection through initializers.
can any one advice if this can be done, and if can be done how ??
thnx in advance.
ios swift dependency-injection
ios swift dependency-injection
asked Nov 14 '18 at 17:16
MhmdRizkMhmdRizk
491410
491410
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
It is impossible since you use Storyboards. When you instantiate ViewController from Storyboard through instantiateViewController
method it uses required init?(coder aDecoder: NSCoder)
initialiser.
If you want to use your custom initialiser, you need to get rid of Storyboards and create UIViewController
only from code or from xib
file. So you will be able to make this:
import UIKit
class B: UIViewController {
var name: String!
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Also you need to provide init(coder...)
since every UI element can be instantiate from Storyboard. But you can leave it with default super
call, since you won't use it.
Another option is to use static
method in ViewController from the post in beginning of your question. But in fact it also assigns variables after ViewController's initialisation.
So no DI through initialisers for now. I would suggest to use separate struct
for all the data which need to be injected in VC. This struct will have all the necessary fields so you won't miss any of them. And you typical flow will be:
- Instantiate VC from Storyboard
- Instantiate
Data
struct - Assign data to VC's
var data: Data!
- Use all the injected variables from it
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53305553%2fdependency-injection-in-uiviewcontrollers-ios-swift%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
It is impossible since you use Storyboards. When you instantiate ViewController from Storyboard through instantiateViewController
method it uses required init?(coder aDecoder: NSCoder)
initialiser.
If you want to use your custom initialiser, you need to get rid of Storyboards and create UIViewController
only from code or from xib
file. So you will be able to make this:
import UIKit
class B: UIViewController {
var name: String!
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Also you need to provide init(coder...)
since every UI element can be instantiate from Storyboard. But you can leave it with default super
call, since you won't use it.
Another option is to use static
method in ViewController from the post in beginning of your question. But in fact it also assigns variables after ViewController's initialisation.
So no DI through initialisers for now. I would suggest to use separate struct
for all the data which need to be injected in VC. This struct will have all the necessary fields so you won't miss any of them. And you typical flow will be:
- Instantiate VC from Storyboard
- Instantiate
Data
struct - Assign data to VC's
var data: Data!
- Use all the injected variables from it
add a comment |
It is impossible since you use Storyboards. When you instantiate ViewController from Storyboard through instantiateViewController
method it uses required init?(coder aDecoder: NSCoder)
initialiser.
If you want to use your custom initialiser, you need to get rid of Storyboards and create UIViewController
only from code or from xib
file. So you will be able to make this:
import UIKit
class B: UIViewController {
var name: String!
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Also you need to provide init(coder...)
since every UI element can be instantiate from Storyboard. But you can leave it with default super
call, since you won't use it.
Another option is to use static
method in ViewController from the post in beginning of your question. But in fact it also assigns variables after ViewController's initialisation.
So no DI through initialisers for now. I would suggest to use separate struct
for all the data which need to be injected in VC. This struct will have all the necessary fields so you won't miss any of them. And you typical flow will be:
- Instantiate VC from Storyboard
- Instantiate
Data
struct - Assign data to VC's
var data: Data!
- Use all the injected variables from it
add a comment |
It is impossible since you use Storyboards. When you instantiate ViewController from Storyboard through instantiateViewController
method it uses required init?(coder aDecoder: NSCoder)
initialiser.
If you want to use your custom initialiser, you need to get rid of Storyboards and create UIViewController
only from code or from xib
file. So you will be able to make this:
import UIKit
class B: UIViewController {
var name: String!
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Also you need to provide init(coder...)
since every UI element can be instantiate from Storyboard. But you can leave it with default super
call, since you won't use it.
Another option is to use static
method in ViewController from the post in beginning of your question. But in fact it also assigns variables after ViewController's initialisation.
So no DI through initialisers for now. I would suggest to use separate struct
for all the data which need to be injected in VC. This struct will have all the necessary fields so you won't miss any of them. And you typical flow will be:
- Instantiate VC from Storyboard
- Instantiate
Data
struct - Assign data to VC's
var data: Data!
- Use all the injected variables from it
It is impossible since you use Storyboards. When you instantiate ViewController from Storyboard through instantiateViewController
method it uses required init?(coder aDecoder: NSCoder)
initialiser.
If you want to use your custom initialiser, you need to get rid of Storyboards and create UIViewController
only from code or from xib
file. So you will be able to make this:
import UIKit
class B: UIViewController {
var name: String!
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Also you need to provide init(coder...)
since every UI element can be instantiate from Storyboard. But you can leave it with default super
call, since you won't use it.
Another option is to use static
method in ViewController from the post in beginning of your question. But in fact it also assigns variables after ViewController's initialisation.
So no DI through initialisers for now. I would suggest to use separate struct
for all the data which need to be injected in VC. This struct will have all the necessary fields so you won't miss any of them. And you typical flow will be:
- Instantiate VC from Storyboard
- Instantiate
Data
struct - Assign data to VC's
var data: Data!
- Use all the injected variables from it
answered Nov 14 '18 at 18:16
Peter TretyakovPeter Tretyakov
2,44162743
2,44162743
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53305553%2fdependency-injection-in-uiviewcontrollers-ios-swift%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown